From 3d69ad00a923dac638565ff72909d6b2c1757cad Mon Sep 17 00:00:00 2001
From: Wiarda <wiardada@ornl.gov>
Date: Fri, 1 Oct 2021 11:51:14 -0400
Subject: [PATCH] Remove Termf and termfx arrays and use data in XctCalc Remove
 Dasig and co from xct Convert to the one and only getParamPerSpinGroup method
 for consistency throughtout Change  function signatures for xct derivatives
 Move Qr and Qi to XctCalc Move array for derivx Move of eta calculation

---
 sammy/src/ang/mang1.f                         |   8 +-
 sammy/src/blk/Exploc_common.f90               |   6 -
 sammy/src/blk/Fixedi_common.f90               |   3 +-
 sammy/src/blk/Templc_common.f90               |  53 +--
 sammy/src/blk/Varyr_common.f90                |   3 -
 sammy/src/blk/ifsubs_common.f90               |  14 -
 sammy/src/cro/CroCrossCalcImpl_M.f90          |  13 -
 sammy/src/cro/CroCrossCalc_M.f90              |   1 +
 sammy/src/cro/mcro0.f90                       |  13 -
 sammy/src/cro/mcro2.f90                       |  57 +--
 sammy/src/cro/mcro2a.f90                      |  53 +--
 sammy/src/cro/mcro4.f90                       | 194 +++++----
 sammy/src/cro/mcro6.f90                       |   6 +-
 sammy/src/endf/VariedParameterInfo.cpp        |  45 +-
 sammy/src/fin/mfin3.f90                       |  16 +-
 sammy/src/inp/minp15.f                        |   1 -
 sammy/src/rec/mrec0.f                         |  55 +--
 sammy/src/rec/mrec2.f90                       |  15 +-
 sammy/src/rec/{mrec3.f => mrec3.f90}          | 139 +++----
 sammy/src/salmon/DerivativeList.cpp           |   2 +-
 .../fortran/DerivativeListHolder_M.f90        |   1 +
 sammy/src/sammy/CMakeLists.txt                |   3 +-
 sammy/src/the/CrossSectionCalcDriver_M.f90    |  15 +-
 sammy/src/the/CrossSectionCalculator_M.f90    |  56 ++-
 sammy/src/the/ZeroKCrossCorrections_M.f90     | 323 ++++++++++-----
 sammy/src/the/mthe0.f90                       |  20 +-
 sammy/src/the/mthe1.f90                       |  91 +---
 sammy/src/xct/XctCrossCalc_M.f90              | 302 ++++++++++++--
 sammy/src/xct/mxct0.f90                       | 119 +-----
 sammy/src/xct/mxct02.f90                      | 120 +++---
 sammy/src/xct/mxct03.f90                      | 148 +++----
 sammy/src/xct/mxct04.f90                      |  21 +-
 sammy/src/xct/mxct05.f90                      |  87 ++--
 sammy/src/xct/mxct06.f90                      | 390 ++++-------------
 sammy/src/xct/mxct07.f90                      | 301 +++++++-------
 sammy/src/xct/mxct08.f90                      |  83 ++--
 sammy/src/xct/mxct09.f90                      | 207 ++++-----
 sammy/src/xct/mxct10.f90                      | 244 +++++------
 sammy/src/xct/mxct11.f90                      | 386 ++++++-----------
 sammy/src/xct/mxct12.f90                      | 236 +++++------
 sammy/src/xct/mxct13.f90                      |  61 +--
 sammy/src/xct/mxct14.f90                      | 200 ++++-----
 sammy/src/xct/mxct15.f90                      | 215 +++++-----
 sammy/src/xct/mxct16.f90                      | 151 +++----
 sammy/src/xct/mxct17.f90                      | 335 +++++++--------
 sammy/src/xct/mxct18.f90                      |  55 +--
 sammy/src/xct/mxct19.f90                      | 392 ++++++------------
 sammy/src/xct/mxct20.f90                      | 150 ++++---
 sammy/src/xct/mxct21.f90                      | 281 ++++++-------
 sammy/src/xct/mxct22.f90                      | 328 +++++++--------
 sammy/src/xct/mxct23.f90                      | 335 ++++++---------
 sammy/src/xct/mxct24.f90                      |   4 -
 sammy/src/xct/mxct26.f90                      |  43 +-
 sammy/src/xct/mxct27.f90                      |  23 +-
 sammy/src/xct/mxct28.f90                      |  44 +-
 sammy/src/xct/mxct31.f90                      | 150 +++----
 sammy/src/xct/mxct32.f90                      | 313 +++++++-------
 57 files changed, 3167 insertions(+), 3763 deletions(-)
 delete mode 100644 sammy/src/blk/ifsubs_common.f90
 rename sammy/src/rec/{mrec3.f => mrec3.f90} (61%)

diff --git a/sammy/src/ang/mang1.f b/sammy/src/ang/mang1.f
index b5e4ddb44..b4aac1292 100644
--- a/sammy/src/ang/mang1.f
+++ b/sammy/src/ang/mang1.f
@@ -572,8 +572,8 @@ C
      *                  Dasigx(Iangle,Iipar) + val
                  else
                     Iparx = Iipar - Ndasig
-                    Dbsigx(Iangle,Iipar) =
-     *                  Dbsigx(Iangle,Iipar) + val
+                    Dbsigx(Iangle,Iparx) =
+     *                  Dbsigx(Iangle,Iparx) + val
                  end if
                END DO
             END DO
@@ -597,8 +597,8 @@ C
      *                       Dasigx(Iangle,Iipar) + val
                         else
                            Iparx = Iipar - Ndasig
-                           Dbsigx(Iangle,Iipar) =
-     *                         Dbsigx(Iangle,Iipar) + val
+                           Dbsigx(Iangle,Iparx) =
+     *                         Dbsigx(Iangle,Iparx) + val
                         end if
                       end do
                   END DO
diff --git a/sammy/src/blk/Exploc_common.f90 b/sammy/src/blk/Exploc_common.f90
index b41b922da..15bea3f25 100644
--- a/sammy/src/blk/Exploc_common.f90
+++ b/sammy/src/blk/Exploc_common.f90
@@ -112,7 +112,6 @@ module exploc_common_m
      
      ! old group 9 
      real(kind=8),allocatable,dimension(:)::A_Iresol
-     integer,allocatable,dimension(:)::I_Iisopa
      real(kind=8),allocatable,dimension(:)::A_Iccoul 
      real(kind=8),allocatable,dimension(:)::A_Idcoul 
      
@@ -511,11 +510,6 @@ module exploc_common_m
        call allocate_real_data(A_Iresol,want)
      end subroutine make_A_Iresol
 
-      subroutine make_I_Iisopa(want)
-       integer::want
-       call allocate_integer_data(I_Iisopa,want)
-     end subroutine make_I_Iisopa
-
      subroutine make_A_Iccoul(want)
        integer::want
        call allocate_real_data(A_Iccoul,want)
diff --git a/sammy/src/blk/Fixedi_common.f90 b/sammy/src/blk/Fixedi_common.f90
index bc9aee8cd..8644a6243 100644
--- a/sammy/src/blk/Fixedi_common.f90
+++ b/sammy/src/blk/Fixedi_common.f90
@@ -93,8 +93,7 @@ module fixedi_m
      ! usually the same as Nfpres (number of varied resonance parameters
      ! except if gamma width data are fitted together
      ! in that case Napres counts the each of the combined gamma width
-     ! and Nfpres counts none of them
-     logical::needResDerivs
+     ! and Nfpres counts none of them    
      integer, pointer :: Nppall  => lfdim(55)
      integer, pointer :: Npar    => lfdim(57)
      ! indexer on lfdim covers up to 57 (next should be 58
diff --git a/sammy/src/blk/Templc_common.f90 b/sammy/src/blk/Templc_common.f90
index 2f191b75e..fec21230b 100644
--- a/sammy/src/blk/Templc_common.f90
+++ b/sammy/src/blk/Templc_common.f90
@@ -6,62 +6,11 @@ module templc_common_m
 ! *** For use in xct and rec
 !
       IMPLICIT NONE
-      
-      real(kind=8),allocatable,dimension(:)::A_Ipgar
-      real(kind=8),allocatable,dimension(:)::A_Ipgai
-      real(kind=8),allocatable,dimension(:)::A_Isinsq
-      real(kind=8),allocatable,dimension(:)::A_Isinph
-      real(kind=8),allocatable,dimension(:)::A_Icscs
-      real(kind=8),allocatable,dimension(:)::A_Irmat
-      real(kind=8),allocatable,dimension(:)::A_Iyinv
-      real(kind=8),allocatable,dimension(:)::A_Iymat
-      real(kind=8),allocatable,dimension(:)::A_Ixqr
-      real(kind=8),allocatable,dimension(:)::A_Ixqi
-      real(kind=8),allocatable,dimension(:)::A_Irootp
-      real(kind=8),allocatable,dimension(:)::A_Linvr
-      real(kind=8),allocatable,dimension(:)::A_Linvi
-      real(kind=8),allocatable,dimension(:)::A_Itermf
-      real(kind=8),allocatable,dimension(:)::A_Icrss
-      real(kind=8),allocatable,dimension(:)::A_Ideriv
-      real(kind=8),allocatable,dimension(:)::A_Icrssx
-      real(kind=8),allocatable,dimension(:)::A_Idervx
-      real(kind=8),allocatable,dimension(:)::A_Iqr
-      real(kind=8),allocatable,dimension(:)::A_Iqi
-      real(kind=8),allocatable,dimension(:)::A_Itr
-      real(kind=8),allocatable,dimension(:)::A_Iti
-      real(kind=8),allocatable,dimension(:)::A_Itx
-      real(kind=8),allocatable,dimension(:)::A_Idpdr
-      real(kind=8),allocatable,dimension(:)::A_Idsdr
-      real(kind=8),allocatable,dimension(:)::A_Ixden
-      integer,allocatable,dimension(:)::I_Inotu
-      real(kind=8),allocatable,dimension(:)::A_Idphi
-      real(kind=8),allocatable,dimension(:)::A_Ipxrr
-      real(kind=8),allocatable,dimension(:)::A_Ipxri
-      real(kind=8),allocatable,dimension(:)::A_Ixxxxr
-      real(kind=8),allocatable,dimension(:)::A_Ixxxxi
-      real(kind=8),allocatable,dimension(:)::A_Icccll
-      real(kind=8),allocatable,dimension(:)::A_Idddll
-      real(kind=8),allocatable,dimension(:)::A_Idsf
-      real(kind=8),allocatable,dimension(:)::A_Idst
-      real(kind=8),allocatable,dimension(:)::A_Idstt
-      real(kind=8),allocatable,dimension(:)::A_Idsfx
-      real(kind=8),allocatable,dimension(:)::A_Idstx
-      real(kind=8),allocatable,dimension(:)::A_Iprer
-      real(kind=8),allocatable,dimension(:)::A_Iprei
-      real(kind=8),allocatable,dimension(:)::A_Iddddd
-      real(kind=8),allocatable,dimension(:)::A_Iterfx
-      real(kind=8),allocatable,dimension(:)::A_Ipsmal
-      integer, save :: Nfprrr
-      real(kind=8),allocatable,dimension(:)::A_Icx
-      real(kind=8),allocatable,dimension(:)::A_Iss
-      real(kind=8),allocatable,dimension(:)::A_Icc
-      real(kind=8),allocatable,dimension(:)::A_Icrsnd
-      real(kind=8),allocatable,dimension(:)::A_Icrxnd
+
       real(kind=8),allocatable,dimension(:)::A_Iedrcp
       real(kind=8),allocatable,dimension(:)::A_Icdrcp
       real(kind=8),allocatable,dimension(:)::A_Ixdrcp
       integer,allocatable,dimension(:)::I_Indrcp
-      real(kind=8),allocatable,dimension(:)::A_Iddtlz
 
       ! cro and mlb
       real(kind=8),allocatable,dimension(:)::A_Ics
diff --git a/sammy/src/blk/Varyr_common.f90 b/sammy/src/blk/Varyr_common.f90
index 0f2f3b058..78555cd69 100644
--- a/sammy/src/blk/Varyr_common.f90
+++ b/sammy/src/blk/Varyr_common.f90
@@ -11,9 +11,6 @@ module varyr_common_m
       double precision, save :: Etz
       double precision, save :: Elz
       
-      integer, save :: Kstart
-      integer, save :: Jstart
-      integer, save :: Npr
       logical::resDeriv
       integer, save :: Npx
       integer, save :: Nnnn
diff --git a/sammy/src/blk/ifsubs_common.f90 b/sammy/src/blk/ifsubs_common.f90
deleted file mode 100644
index 8554cff7c..000000000
--- a/sammy/src/blk/ifsubs_common.f90
+++ /dev/null
@@ -1,14 +0,0 @@
-
-module ifsubs_common
-
-    ! used in xct: 02, 06 and rec3
-
-    implicit none
-
-    integer(4):: Ifzzz
-    integer(4):: Ifext
-    integer(4):: Ifrad
-    integer(4):: Ifiso
-    integer(4):: Ifradt
-
-end module ifsubs_common
diff --git a/sammy/src/cro/CroCrossCalcImpl_M.f90 b/sammy/src/cro/CroCrossCalcImpl_M.f90
index bdc67ace1..5f5ccce75 100644
--- a/sammy/src/cro/CroCrossCalcImpl_M.f90
+++ b/sammy/src/cro/CroCrossCalcImpl_M.f90
@@ -151,7 +151,6 @@ contains
        !
        ! - - - - - - - - - - - - - - - - <
        ! *** six ***
-       call allocate_real_data(A_Ixden, Nres)
        ! CALL Abpart
        ! - - - - - - - - - - - - - - - - >
        !
@@ -159,32 +158,20 @@ contains
        N = Ntotc
        call allocate_real_data(A_Ics, N)
        call allocate_real_data(A_Isi, N)
-       call allocate_real_data(A_Idphi, N)
        call allocate_real_data(A_Iz, N)
        N = Nn
        call allocate_real_data(A_Iwr, N)
        call allocate_real_data(A_Iwi, N)
-       call allocate_real_data(A_Ixxxxr, N)
-       call allocate_real_data(A_Ixxxxi, N)
        N = Nn*2
-       call allocate_real_data(A_Irmat, N)
        call allocate_real_data(A_Irinv, N)
        N = Ntotc*Ntotc
        call allocate_real_data(A_Ipwrr, N)
        call allocate_real_data(A_Ipwri, N)
-       call allocate_real_data(A_Ixqr, N)
-       call allocate_real_data(A_Ixqi, N)
-       call allocate_real_data(A_Itr, N)
-       call allocate_real_data(A_Iti, N)
        N = Ntotc
        call allocate_real_data(A_Isphr, N)
        call allocate_real_data(A_Isphi, N)
        call allocate_real_data(A_Iphr, N)
        call allocate_real_data(A_Iphi, N)
-       N = Nn*Nn
-       call allocate_real_data(A_Iqr, N)
-       call allocate_real_data(A_Iqi, N)
-       N = N6
    end subroutine
 
 end module CroCrossCalcImpl_M
diff --git a/sammy/src/cro/CroCrossCalc_M.f90 b/sammy/src/cro/CroCrossCalc_M.f90
index 2d7aa1cc6..1d328af49 100644
--- a/sammy/src/cro/CroCrossCalc_M.f90
+++ b/sammy/src/cro/CroCrossCalc_M.f90
@@ -10,6 +10,7 @@ module CroCrossCalc_M
   implicit none
 
   type, extends(XctCrossCalc) :: CroCrossCalc
+     real(kind=8),allocatable,dimension(:)::A_Isigxx, A_Idasig, A_Idbsig
      contains
      procedure, pass(this) :: setUpDerivativeList => CroCrossCalc_setUpDerivativeList    ! set up  crossData, depending on number of isotopes
      procedure, pass(this) :: initialize => CroCrossCalc_initialize
diff --git a/sammy/src/cro/mcro0.f90 b/sammy/src/cro/mcro0.f90
index 0435f407c..a4223d1e5 100644
--- a/sammy/src/cro/mcro0.f90
+++ b/sammy/src/cro/mcro0.f90
@@ -88,7 +88,6 @@
 !
 ! - - - - - - - - - - - - - - - - <
 ! *** six ***
-      !call allocate_real_data(A_Ixden, Nres)
 ! CALL Abpart
 ! - - - - - - - - - - - - - - - - >
 !
@@ -96,31 +95,20 @@
       N = Ntotc
       !call allocate_real_data(A_Ics, N)
       !call allocate_real_data(A_Isi, N)
-      !call allocate_real_data(A_Idphi, N)
       !call allocate_real_data(A_Iz, N)
       N = Nn
       !call allocate_real_data(A_Iwr, N)
       !call allocate_real_data(A_Iwi, N)
-      !call allocate_real_data(A_Ixxxxr, N)
-      !call allocate_real_data(A_Ixxxxi, N)
       N = Nn*2
-      !call allocate_real_data(A_Irmat, N)
       !call allocate_real_data(A_Irinv, N)
       N = Ntotc*Ntotc
       !call allocate_real_data(A_Ipwrr, N)
       !call allocate_real_data(A_Ipwri, N)
-      !call allocate_real_data(A_Ixqr, N)
-      !call allocate_real_data(A_Ixqi, N)
-      !call allocate_real_data(A_Itr, N)
-      !call allocate_real_data(A_Iti, N)
       N = Ntotc
       !call allocate_real_data(A_Isphr, N)
       !call allocate_real_data(A_Isphi, N)
       !call allocate_real_data(A_Iphr, N)
       !call allocate_real_data(A_Iphi, N)
-      N = Nn*Nn
-      !call allocate_real_data(A_Iqr, N)
-      !call allocate_real_data(A_Iqi, N)
       N = N6
 ! CALL Parsh
 ! - - - - - - - - - - - - - - - - - - - - - - >
@@ -132,7 +120,6 @@
 !
       !deallocate(A_Ics)
       !deallocate(A_Isi)
-      !deallocate(A_Idphi)
 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
 !
 !
diff --git a/sammy/src/cro/mcro2.f90 b/sammy/src/cro/mcro2.f90
index 9719f6c6c..897d34d57 100644
--- a/sammy/src/cro/mcro2.f90
+++ b/sammy/src/cro/mcro2.f90
@@ -30,45 +30,45 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Rinvrs (Rmat, Rinv, Sphr, Sphi, Xqr, Xqi, Ntot)
+      SUBROUTINE Rinvrs (calc, Rinv, Sphr, Sphi,Ntot)
 !
 ! *** PURPOSE -- INVERT Rmat TO GIVE Rinv
 !
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Rmat(2,*), Rinv(2,*), Sphr(*), Sphi(*),   &
-           Xqr(Ntot,*), Xqi(Ntot,*)
+      class(CroCrossCalc)::calc
+      DIMENSION Rinv(2,*), Sphr(*), Sphi(*)
 !
       IF (Ntot.LE.3) THEN
 !
          IF (Ntot.EQ.1) THEN
 ! ***       ONE CHANNEL -- (inverse of Rmat) = Rinv
-            CALL Onech (Rmat, Rinv)
+            CALL Onech (calc%Rmat, Rinv)
 !
          ELSE IF (Ntot.EQ.2) THEN
 ! ***       TWO CHANNELS -- (inverse of Rmat) = Rinv
-            CALL Twoch (Rmat, Rinv)
+            CALL Twoch (calc%Rmat, Rinv)
 !
          ELSE IF (Ntot.EQ.3) THEN
 ! ***       THREE CHANNELS -- (inverse of Rmat) = Rinv
-            CALL Three (Rmat, Rinv)
+            CALL Three (calc%Rmat, Rinv)
 !
          END IF
          Ij = 0
          DO I=1,Ntot
             DO J=1,I
                Ij = Ij + 1
-               Xqr(J,I) = Rinv(1,Ij)*Sphr(I) - Rinv(2,Ij)*Sphi(I)
-               Xqi(J,I) = Rinv(1,Ij)*Sphi(I) + Rinv(2,Ij)*Sphr(I)
+               calc%Xqr(J,I) = Rinv(1,Ij)*Sphr(I) - Rinv(2,Ij)*Sphi(I)
+               calc%Xqi(J,I) = Rinv(1,Ij)*Sphi(I) + Rinv(2,Ij)*Sphr(I)
                IF (I.NE.J) THEN
-                  Xqr(I,J) = Rinv(1,Ij)*Sphr(J) - Rinv(2,Ij)*Sphi(J)
-                  Xqi(I,J) = Rinv(1,Ij)*Sphi(J) + Rinv(2,Ij)*Sphr(J)
+                  calc%Xqr(I,J) = Rinv(1,Ij)*Sphr(J) - Rinv(2,Ij)*Sphi(J)
+                  calc%Xqi(I,J) = Rinv(1,Ij)*Sphi(J) + Rinv(2,Ij)*Sphr(J)
                END IF
             END DO
          END DO
 !
       ELSE
 ! ***    INVERT Rmat TO GIVE Rinv FOR MORE THAN THREE CHANNELS
-         CALL Four (Rmat, Rinv, Sphr, Sphi, Xqr, Xqi, Ntot)
+         CALL Four (calc%Rmat, Rinv, Sphr, Sphi, calc%Xqr, calc%Xqi, Ntot)
 !
       END IF
 !
@@ -85,8 +85,9 @@ contains
 !
 !     NML, October 1993; based on LINPACK routines but for complex arrays.
 !
+      use Xspfa_Xspsl_m
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Rmat(2,*), Dummy(2,*), Iii(100), Sphr(*), Sphi(*),   &
+      DIMENSION Rmat(:,:), Dummy(2,*), Iii(100), Sphr(*), Sphi(*),   &
          Xqr(Ntot,*), Xqi(Ntot,*)
       DATA Maxaa /100/, Zero /0.0d0/
 !
@@ -116,7 +117,7 @@ contains
 !
       SUBROUTINE Setr_Cro (calc, Ntot, Bound, Echan,   &
          Min,  igr,   &
-         Z, Rmat, Sphr, Sphi, Phr, Phi, Zke, Lrmat)
+         Z,  Sphr, Sphi, Phr, Phi, Zke, Lrmat)
 !
 ! *** PURPOSE -- GENERATE Rmat = 1/(S-B+IP)
 ! ***            - Sum Beta*Beta/((DEL E)**2-(Gamgam/2)**2)
@@ -148,7 +149,7 @@ contains
       real(kind=8)::Parext(7)
       DIMENSION   &
          Bound(Ntotc,*), Echan(Ntotc,*),   &
-         Rmat(2,*), Sphr(*), Sphi(*), Phr(*), Phi(*), Z(*),   &
+          Sphr(*), Sphi(*), Phr(*), Phi(*), Z(*),   &
          Zke(*)
 !
 !      DIMENSION Ishift(Ntotc,Ngroup), Lpent(Ntotc,Ngroup),
@@ -182,12 +183,12 @@ contains
          end if
          DO L=1,K
             KL = KL + 1
-            Rmat(1,KL) = Zero
-            Rmat(2,KL) = Zero
+            calc%Rmat(1,KL) = Zero
+            calc%Rmat(2,KL) = Zero
             IF (L.EQ.K .AND. hasRext) THEN
-               Rmat(1,KL) = -(Parext(3)+Parext(4)*Su) +   &
+               calc%Rmat(1,KL) = -(Parext(3)+Parext(4)*Su) +   &
                               Parext(5)*Aloge
-               IF (Nrext.EQ.7) Rmat(1,KL) = Rmat(1,KL) -   &
+               IF (Nrext.EQ.7) calc%Rmat(1,KL) = calc%Rmat(1,KL) -   &
                   Parext(7)*Su**2 + Parext(6)*   &
                   (Parext(2)-Parext(1)) +   &
                   Parext(6)*Aloge*(Su)
@@ -209,9 +210,9 @@ contains
                beta =  channelWidthC * channelWidthCPrime 
                KL = KL + 1
                IF (Beta.NE.Zero) THEN
-                  Rmat(1,KL) = Rmat(1,KL) - calc%Alphar(I)*Beta
+                  calc%Rmat(1,KL) = calc%Rmat(1,KL) - calc%Alphar(I)*Beta
                   IF (calc%needAlphai(I)) THEN
-                     Rmat(2,KL) = Rmat(2,KL) - calc%Alphai(I)*Beta
+                     calc%Rmat(2,KL) = calc%Rmat(2,KL) - calc%Alphai(I)*Beta
                   END IF
                END IF
             END DO
@@ -223,8 +224,8 @@ contains
       DO K=1,Ntot
          DO L=1,K
             KL = KL + 1
-            IF (Rmat(1,KL).NE.Zero) GO TO 63
-            IF (Rmat(2,KL).NE.Zero) GO TO 63
+            IF (calc%Rmat(1,KL).NE.Zero) GO TO 63
+            IF (calc%Rmat(2,KL).NE.Zero) GO TO 63
          END DO
       END DO
       Lrmat = 1
@@ -285,8 +286,8 @@ contains
                Sphi(I) = Hi*Ps
                Phr(I) = Hr*P
                Phi(I) = Hi*P
-               Rmat(1,Ii) = Hr + Rmat(1,II)
-               Rmat(2,Ii) = Hi + Rmat(2,II)
+               calc%Rmat(1,Ii) = Hr + calc%Rmat(1,II)
+               calc%Rmat(2,Ii) = Hi + calc%Rmat(2,II)
                Z(I) = Dp/P
             END IF
 !
@@ -296,11 +297,11 @@ contains
             Sphi(I) = -One
 !           Phr(I) = Zero
             Phi(I) = -One
-!           Rmat(1,II) = Rmat(1,II)
-            Rmat(2,II) = Rmat(2,II) - One
+!           calc%Rmat(1,II) = calc%Rmat(1,II)
+            calc%Rmat(2,II) = calc%Rmat(2,II) - One
             IF (Iffy.NE.0) THEN
-               Rmat(1,II) = Zero
-               Rmat(2,II) = -One
+               calc%Rmat(1,II) = Zero
+               calc%Rmat(2,II) = -One
             END IF
 !           Z(I) = Zero
          END IF
diff --git a/sammy/src/cro/mcro2a.f90 b/sammy/src/cro/mcro2a.f90
index dee459d3b..a17ef6666 100644
--- a/sammy/src/cro/mcro2a.f90
+++ b/sammy/src/cro/mcro2a.f90
@@ -18,7 +18,7 @@ contains
      class(CroCrossCalc)::calc
 !
 !
-     CALL Abpart_Cro (  calc, A_Ixden,   A_Idifma)
+     CALL Abpart_Cro (calc)
 !
      CALL Parsh ( calc,  &
         A_Izke  ,   &
@@ -29,7 +29,7 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Abpart_Cro (calc,   Xden, Difmax)
+      SUBROUTINE Abpart_Cro (calc)
 !
 ! *** PURPOSE -- GENERATE Upr AND Upi = ENERGY-DEPENDENT Pieces OF
 ! ***            PR AND PI = PARTIAL OF R WRT U-PARAMETERS
@@ -49,17 +49,10 @@ contains
       type(SammyResonanceInfo)::resInfo
       type(SammySpinGroupInfo)::spinInfo
       type(RMatResonance)::resonance
-      real(kind=8)::   &
-         Xden(*),   &
-         Difmax(*)
       real(kind=8)::Zero, Two
       real(kind=8)::Aa, G2, G3
       integer::I, Igam, igr, Ij, Ipar, J, K, M, N2, N, Iflr, ires
       real(kind=8)::Upr, Upi
-!
-!      DIMENSION
-!     *   Xden(Nres),
-!     *   Difmax(Nres), Xx(Nres)
 !
       DATA Zero /0.0d0/, Two /2.0d0/
 !
@@ -70,14 +63,14 @@ contains
       DO I=1,resParData%getNumResonances()
          call resParData%getResonanceInfo(resInfo, I)
          call  resParData%getRedResonance(resonance, resInfo)
-         Xden(I)  = Zero
+         calc%Xden(I)  = Zero
          calc%Alphar(I)= Zero
          calc%Alphai(I)= Zero
          calc%Difen(I) = resonance%getEres() - Su
          if (calc%doResShift) then
             calc%Difen(I) = calc%Difen(I) + calc%Xx(I)
          end if
-         IF (dABS(calc%Difen(I)).LT.100.0D0*Difmax(I)) calc%needAlphai(I) = .true.
+         IF (dABS(calc%Difen(I)).LT.100.0D0*calc%Difmax(I)) calc%needAlphai(I) = .true.
 
          call resParData%getResonanceInfo(resInfo, I)
          igr = resInfo%getSpinGroupIndex()
@@ -87,9 +80,9 @@ contains
             G2 = resonance%getWidth(igam)**2
             G3 = G2**2
             Aa = calc%Difen(I)**2 + G3
-            Xden(I) = 1.0D0/Aa
-            calc%Alphar(I) = calc%Difen(I)*Xden(I)
-            IF (calc%needAlphai(I)) calc%Alphai(I) = G2*Xden(I)
+            calc%Xden(I) = 1.0D0/Aa
+            calc%Alphar(I) = calc%Difen(I)*calc%Xden(I)
+            IF (calc%needAlphai(I)) calc%Alphai(I) = G2*calc%Xden(I)
          END IF
       END DO
 !
@@ -119,15 +112,15 @@ contains
                 N   =  calc%Inum(K,3)   ! index of resonance
                 Upr = 0.0d0
                 Upi = 0.0d0
-                IF (dABS(calc%Difen(N)).LE.Difmax(N)) THEN
+                IF (dABS(calc%Difen(N)).LE.calc%Difmax(N)) THEN
                    Upr = calc%Alphar(N)
                    Upi = calc%Alphai(N)
                    IF (M.LT.2) THEN
                       Upi = Upr*Upi
-                      Upr = -Two*Upr*Upr  + Xden(N)
+                      Upr = -Two*Upr*Upr  + calc%Xden(N)
                    ELSE IF (M.EQ.2) THEN
                       Upr = Upr*Upi
-                      Upi = -Two*Upi*Upi  + Xden(N)
+                      Upi = -Two*Upi*Upi  + calc%Xden(N)
                    ELSE
                    END IF
                 END IF
@@ -250,7 +243,7 @@ contains
 ! ***          CALCULATE SIN AND COS OF POTENTIAL SCATTERING PHASE SHIFT,
 ! ***             AND R-EXTERNAL PHASE SHIFT
                CALL Cossin (resparData, Zke(1,N),   &
-                           A_Ics, A_Isi, A_Idphi, Nnnn, Ipoten,   &
+                           A_Ics, A_Isi, calc%Dphi, Nnnn, Ipoten,   &
                            Squ, Su)
             END IF
 !
@@ -262,7 +255,7 @@ contains
             Lrmat = 0
             CALL Setr_Cro (calc, Ntotnn,   &
                A_Ibound , A_Iechan , Min, n,   &
-               A_Iz , A_Irmat , A_Isphr , A_Isphi , A_Iphr , A_Iphi ,   &
+               A_Iz ,  A_Isphr , A_Isphi , A_Iphr , A_Iphi ,   &
                Zke(1,N),   Lrmat)
 !
             IF (Lrmat.EQ.1) THEN
@@ -270,18 +263,17 @@ contains
                   Ntotnn)
             ELSE
 ! ***          INVERT R-MATRIX; generate Xqr & Xqi
-               CALL Rinvrs (A_Irmat , A_Irinv , A_Isphr , A_Isphi ,   &
-                  A_Ixqr , A_Ixqi, Ntotnn)
+               CALL Rinvrs (calc, A_Irinv , A_Isphr , A_Isphi ,  Ntotnn)
 ! ***          GENERATE WR AND WI MATRICES
-               CALL Wrwi (calc, Ntotnn, A_Iwr , A_Iwi, A_Ixxxxr , A_Ixxxxi ,   &
-                  A_Ixqr , A_Ixqi , A_Isphr , A_Isphi , A_Iphr ,A_Iphi )
+               CALL Wrwi (calc, Ntotnn, A_Iwr , A_Iwi,  &
+                  A_Isphr , A_Isphi , A_Iphr ,A_Iphi )
             END IF
 !
 ! ***       QUANTITIES NEEDED FOR GENERATING PARTIAL DERIVATIVES OF
 ! ***         THE CROSS SECTIONS
             IF (Lrmat.EQ.0 .AND. Ksolve.NE.2) CALL Partls (calc, Ntotnn,   &
-               A_Iz , A_Ixxxxr , A_Ixxxxi , A_Ipwrr , A_Ipwri ,   &
-               A_Ixqr , A_Ixqi , A_Iphr , A_Iphi , A_Iqr , A_Iqi, N )
+               A_Iz ,  A_Ipwrr , A_Ipwri ,   &
+               A_Iphr , A_Iphi , N )
 !
             Agoj = VarAbn*spinInfo%getGFactor()
 ! ***       TOTAL CROSS SECTIONS
@@ -289,16 +281,15 @@ contains
             next = spinInfo%getNumExitChannels()          
             IF (Kcros.EQ.1) CALL Total (calc, spinInfo,    &
                A_Ics, A_Isi,   &
-               A_Idphi , A_Iwr , A_Iwi , A_Ipwrr , A_Ipwri , A_Itr ,   &
-               A_Iti , A_Iqr , A_Iqi , Lrmat,   &
+               A_Iwr , A_Iwi , A_Ipwrr , A_Ipwri , Lrmat,   &
                N, Zke(1,N),   &
                iflAbund, ipar)
 !
 ! ***       SCATTERING (ELASTIC) CROSS SECTION
             IF (Kcros.EQ.2) CALL Elastc (calc, spinInfo,   &
                A_Ics,   &
-               A_Isi, A_Idphi , A_Iwr , A_Iwi, A_Ipwrr , A_Ipwri ,   &
-               A_Itr , A_Iti , A_Iqr , A_Iqi , Lrmat,   &
+               A_Isi, A_Iwr , A_Iwi, A_Ipwrr , A_Ipwri ,   &
+               Lrmat,   &
                N, Zke(1,N),   &
                iflAbund, ipar)
 !
@@ -306,7 +297,7 @@ contains
             IF (Kcros.EQ.3 .OR. Kcros.EQ.5 .OR. Kcros.EQ.6) CALL Reactn   &
                ( calc, spinInfo,     &
                A_Iwr, A_Iwi, A_Ipwrr ,   &
-               A_Ipwri , A_Itr , A_Iti , A_Iqr , A_Iqi ,  &
+               A_Ipwri ,   &
                Lrmat,   N,   &
                Zke(1,N), iflAbund, ipar)
 !
@@ -314,7 +305,7 @@ contains
             IF (Kcros.EQ.4 .OR. Kcros.EQ.5 .OR. Kcros.EQ.6) CALL Captur   &
                ( calc, spinInfo,   &
                A_Iwr, A_Iwi, A_Ipwrr ,   &
-               A_Ipwri , A_Itr , A_Iti , A_Iqr , A_Iqi,   &
+               A_Ipwri ,   &
                Lrmat, N,    &
                Zke(1,N), iflAbund, ipar)
 !
diff --git a/sammy/src/cro/mcro4.f90 b/sammy/src/cro/mcro4.f90
index 9d61d79ab..e549200d2 100644
--- a/sammy/src/cro/mcro4.f90
+++ b/sammy/src/cro/mcro4.f90
@@ -5,7 +5,7 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Wrwi (calc, Ntot, Wr, Wi, Xxxxr, Xxxxi, Xqr, Xqi, Sphr, Sphi,   &
+      SUBROUTINE Wrwi (calc, Ntot, Wr, Wi, Sphr, Sphi,   &
          Phr, Phi)
 !
 ! *** PURPOSE -- use Xqr AND Xqi MATRICES, WHERE
@@ -24,11 +24,9 @@ contains
 !
       class(CroCrossCalc)::calc
       integer ::ntot
-      real(kind=8) ::  Phr(*), Phi(*), Sphr(*), Sphi(*), Xqr(Ntot,*),   &
-         Xqi(Ntot,*), Wr(*), Wi(*), Xxxxr(*), Xxxxi(*)
+      real(kind=8) ::  Phr(*), Phi(*), Sphr(*), Sphi(*), Wr(*), Wi(*)
 !      DIMENSION Rinv(2,NN), Phr(Ntotc), Phi(Ntotc),
-!     *   Sphr(Ntotc), Sphi(Ntotc), Xqr(Ntot,Ntot),
-!     *   Xqi(Ntot,Ntot), Wr(NN), Wi(NN), Xxxxr(NN), Xxxxi(NN)
+!     *   Sphr(Ntotc), Sphi(Ntotc), Wr(NN), Wi(NN)
       real(kind=8), parameter :: One = 1.0d0, Two = 2.0d0
 
       integer :: I, Ij, J
@@ -38,10 +36,10 @@ contains
       DO I=1,Ntot
          DO J=1,I
             Ij = Ij + 1
-            Xxxxi(Ij) = Sphi(J)*Xqr(J,I) + Sphr(J)*Xqi(J,I)
-            Xxxxr(Ij) = Sphr(J)*Xqr(J,I) - Sphi(J)*Xqi(J,I)
-            Wr(Ij) = -Two*Xxxxi(Ij)
-            Wi(Ij) =  Two*Xxxxr(Ij)
+            calc%Xxxxi(Ij) = Sphi(J)*calc%Xqr(J,I) + Sphr(J)*calc%Xqi(J,I)
+            calc%Xxxxr(Ij) = Sphr(J)*calc%Xqr(J,I) - Sphi(J)*calc%Xqi(J,I)
+            Wr(Ij) = -Two*calc%Xxxxi(Ij)
+            Wi(Ij) =  Two*calc%Xxxxr(Ij)
             IF (J.EQ.I) THEN
                Wr(Ij) = Wr(Ij) + One + Two*Phi(I)
                Wi(Ij) = Wi(Ij) - Two*Phr(I)
@@ -54,8 +52,8 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Partls (calc, Ntot, Z, Xxxxr, Xxxxi, Pwrhor, Pwrhoi,   &
-         Xqr, Xqi, Phr, Phi, Qr, Qi, igr)
+      SUBROUTINE Partls (calc, Ntot, Z, Pwrhor, Pwrhoi,   &
+          Phr, Phi, igr)
 !
 ! *** PURPOSE -- GENERATE Qr,Qi =
 ! ***            SQRT(P)/(S-B+IP) * (Rinv*Rinv
@@ -74,11 +72,10 @@ contains
 !
       class(CroCrossCalc)::calc
       integer :: ntot
-      real(kind=8) ::  Qr(NN,*), Qi(NN,*), Xqr(Ntot,*), Xqi(Ntot,*),   &
-         Xxxxr(*), Xxxxi(*), Pwrhor(*), Pwrhoi(*), Phr(*), Phi(*), Z(*)
+      real(kind=8) ::  Pwrhor(*), Pwrhoi(*), Phr(*), Phi(*), Z(*)
 !
-!      DIMENSION Qr(NN,NN), Qi(NN,NN), Xqr(Ntot,Ntot), Xqi(Ntot,Ntot),
-!     *   Xxxxr(NN), Xxxxi(NN), Pwrhor(NN), Pwrhoi(NN),
+!      DIMENSION
+!     *   Pwrhor(NN), Pwrhoi(NN),
 !     *   Phr(Ntot), Phi(Ntot), Z(Ntot)
 !
       real(kind=8), parameter :: Zero = 0.0d0, One = 1.0d0, Two = 2.0d0
@@ -99,13 +96,13 @@ contains
                DO I=1,Ntot
                   DO J=1,I
                      Ij = Ij + 1
-                     Qr(Ij,Kl) = Xqr(I,K)*Xqr(J,L) - Xqi(I,K)*Xqi(J,L)
-                     Qi(Ij,Kl) = Xqr(I,K)*Xqi(J,L) + Xqi(I,K)*Xqr(J,L)
+                     calc%Qr(Ij,Kl) = calc%Xqr(I,K)*calc%Xqr(J,L) - calc%Xqi(I,K)*calc%Xqi(J,L)
+                     calc%Qi(Ij,Kl) = calc%Xqr(I,K)*calc%Xqi(J,L) + calc%Xqi(I,K)*calc%Xqr(J,L)
                      IF (I.NE.J) THEN
-                        Qr(Ij,Kl) = Qr(Ij,Kl) + Xqr(J,K)*Xqr(I,L) -   &
-                                                Xqi(J,K)*Xqi(I,L)
-                        Qi(Ij,Kl) = Qi(Ij,Kl) + Xqr(J,K)*Xqi(I,L) +   &
-                                                Xqi(J,K)*Xqr(I,L)
+                        calc%Qr(Ij,Kl) = calc%Qr(Ij,Kl) + calc%Xqr(J,K)*calc%Xqr(I,L) -   &
+                                                calc%Xqi(J,K)*calc%Xqi(I,L)
+                        calc%Qi(Ij,Kl) = calc%Qi(Ij,Kl) + calc%Xqr(J,K)*calc%Xqi(I,L) +   &
+                                                calc%Xqi(J,K)*calc%Xqr(I,L)
                      END IF
                   END DO
                END DO
@@ -127,12 +124,12 @@ contains
          Pwrhor(Ii) = -Two*Z(I)*(Phr(I)*Phr(I)-Phi(I)* (Phi(I)+One))
          Pwrhoi(Ii) = -Two*Z(I)*( Two*Phr(I)*Phi(I) + Phr(I) )
          IF (Z(I).NE.Zero) THEN
-            AR = Two*Phr(I) - Xxxxr(Ii)
-            AI = One + Two*Phi(I) - Xxxxi(Ii)
+            AR = Two*Phr(I) - calc%Xxxxr(Ii)
+            AI = One + Two*Phi(I) - calc%Xxxxi(Ii)
             Pwrhor(Ii) = Pwrhor(Ii) +   &
-               Two*(Xxxxr(Ii)*AR-Xxxxi(Ii)*AI)*Z(I)
+               Two*(calc%Xxxxr(Ii)*AR-calc%Xxxxi(Ii)*AI)*Z(I)
             Pwrhoi(Ii) = Pwrhoi(Ii) +   &
-               Two*(Xxxxr(Ii)*AI+Xxxxi(Ii)*AR)*Z(I)
+               Two*(calc%Xxxxr(Ii)*AI+calc%Xxxxi(Ii)*AR)*Z(I)
          END IF
          DO J=1,I
             Ij = Ij + 1
@@ -141,17 +138,17 @@ contains
                   AR = Two*Phr(I)
                   AI = One + Two*Phi(I)
                   Pwrhor(Ij) = Pwrhor(Ij) + Z(I)*   &
-                     (AR*Xxxxr(Ij)-AI*Xxxxi(Ij))
+                     (AR*calc%Xxxxr(Ij)-AI*calc%Xxxxi(Ij))
                   Pwrhoi(Ij) = Pwrhoi(Ij) + Z(I)*   &
-                     (AR*Xxxxi(Ij)+AI*Xxxxr(Ij))
+                     (AR*calc%Xxxxi(Ij)+AI*calc%Xxxxr(Ij))
                END IF
                IF (Z(J).NE.Zero) THEN
                   AR = Two*Phr(J)
                   AI = One + Two*Phi(J)
                   Pwrhor(Ij) = Pwrhor(Ij) + Z(J)*   &
-                     (AR*Xxxxr(Ij)-AI*Xxxxi(Ij))
+                     (AR*calc%Xxxxr(Ij)-AI*calc%Xxxxi(Ij))
                   Pwrhoi(Ij) = Pwrhoi(Ij) + Z(J)*   &
-                     (AR*Xxxxi(Ij)+AI*Xxxxr(Ij))
+                     (AR*calc%Xxxxi(Ij)+AI*calc%Xxxxr(Ij))
                END IF
             END IF
             DO M=1,Ntot
@@ -167,9 +164,9 @@ contains
                      JM = (M*(M-1))/2 + J
                   END IF
                   Pwrhor(Ij) = Pwrhor(Ij) - Two*Z(M)*   &
-                               (Xxxxr(IM)*Xxxxr(JM)-Xxxxi(IM)*Xxxxi(JM))
+                               (calc%Xxxxr(IM)*calc%Xxxxr(JM)-calc%Xxxxi(IM)*calc%Xxxxi(JM))
                   Pwrhoi(Ij) = Pwrhoi(Ij) - Two*Z(M)*   &
-                               (Xxxxr(IM)*Xxxxi(JM)+Xxxxi(IM)*Xxxxr(JM))
+                               (calc%Xxxxr(IM)*calc%Xxxxi(JM)+calc%Xxxxi(IM)*calc%Xxxxr(JM))
                END IF
             END DO
          END DO
@@ -207,7 +204,7 @@ contains
 ! --------------------------------------------------------------
 !
       SUBROUTINE Total (calc, spinInfo,    &
-         Cs, Si, Dphi, Wr, Wi, Pwrhor, Pwrhoi, TR, TI, Qr, Qi,   &
+         Cs, Si, Wr, Wi, Pwrhor, Pwrhoi,   &
          Lrmat, igr, Zke, If_Zke, ipar)
 !
 ! *** PURPOSE -- GENERATE CROSS SECTION and
@@ -229,16 +226,14 @@ contains
 !
       type(SammySpinGroupInfo)::spinInfo
       real(kind=8) ::   &
-         Cs(*), Si(*), Dphi(*),   &
-         Wr(*), Wi(*), Pwrhor(*), Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*),   &
-         Qi(NN,*), Zke(*)
+         Cs(*), Si(*),   &
+         Wr(*), Wi(*), Pwrhor(*), Pwrhoi(*),  Zke(*)
       real(kind=8)::val
 
 !
 !      DIMENSION
-!     *     Cs(Ntotc), Si(Ntotc), Dphi(Ntotc), Wr(NN), Wi(NN),
-!     *     Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN),
-!     *     Qi(NN,NN), Zke(Ntotc)
+!     *     Cs(Ntotc), Si(Ntotc),  Wr(NN), Wi(NN),
+!     *     Pwrhor(NN), Pwrhoi(NN), Zke(Ntotc)
 !
       real(kind=8), parameter :: Zero = 0.0d0, One = 1.0d0, Two = 2.0d0
 !
@@ -265,7 +260,7 @@ contains
          END IF
          Keff = radFitFlags%getEffFitFlag(Igr, I)
          IF (Keff.GT.0.and.calc%wantDerivs) THEN
-           val = - Two*B* ( Cs(I)*Wi(Ij)-Si(I)*Wr(Ij) )*Dphi(I)/Zke(I)
+           val = - Two*B* ( Cs(I)*Wi(Ij)-Si(I)*Wr(Ij) )*calc%Dphi(I)/Zke(I)
            call calc%crossData%setSharedValNs(calc%row, 1, Keff, val)
           END IF
       END DO
@@ -282,9 +277,10 @@ contains
       IF (Lrmat.EQ.1) RETURN
       IF (Ksolve.EQ.2) RETURN
       IF (.not.calc%wantDerivs) RETURN
+      if (.not.allocated(calc%tr)) return
 !
-      CALL Zero_Array (Tr, Ntriag)
-      CALL Zero_Array (Ti, Ntriag)
+      calc%Tr(1,:) = 0.0d0
+      calc%Ti(1,:) = 0.0d0
 !
 ! *** GENERATE TR AND TI, WHERE
 ! ***      Tr(Ij) = REAL PART OF PARTIAL (CROSS SECTION) WiTH
@@ -297,17 +293,17 @@ contains
          DO I=1,Ntot
             DO J=1,I
                Ij = Ij + 1
-               Ti(Ij) = Ti(Ij) + Qr(Ij,Kl)*Cs(K) +   &
-                                 Qi(Ij,Kl)*Si(K)
-               Tr(Ij) = Tr(Ij) + Qi(Ij,Kl)*Cs(K) -   &
-                                 Qr(Ij,Kl)*Si(K)
+               calc%Ti(1,Ij) = calc%Ti(1, Ij) + calc%Qr(Ij,Kl)*Cs(K) +   &
+                                 calc%Qi(Ij,Kl)*Si(K)
+               calc%Tr(1,Ij) = calc%Tr(1,Ij) + calc%Qi(Ij,Kl)*Cs(K) -   &
+                                 calc%Qr(Ij,Kl)*Si(K)
             END DO
          END DO
       END DO
 !
-      CALL Derres_Cro (calc, spinInfo,  Igr, Tr, Ti, ipar)
+      CALL Derres_Cro (calc, spinInfo,  Igr, ipar)
 !
-      CALL  Derext_Cro(calc, spinInfo, Igr,  TR)
+      CALL  Derext_Cro(calc, spinInfo, Igr)
 !
       RETURN
       END
@@ -316,7 +312,7 @@ contains
 ! --------------------------------------------------------------
 !
       SUBROUTINE Elastc (calc, spinInfo,      &
-         Cs, Si, Dphi, Wr, Wi, Pwrhor, Pwrhoi, Tr, Ti, Qr, Qi,   &
+         Cs, Si, Wr, Wi, Pwrhor, Pwrhoi,   &
          Lrmat,  igr, Zke, If_Zke, ipar)
 !
 ! *** PURPOSE -- GENERATE CROSS SECTION
@@ -337,17 +333,15 @@ contains
       integer :: Nent, Ntot,  Lrmat, igr, If_Zke, ipar
       
       real(kind=8) ::   &
-         Cs(*), Si(*), Dphi(*),   &
-         Wr(*), Wi(*), Pwrhor(*), Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*),   &
-         Qi(NN,*),  Zke(*)
+         Cs(*), Si(*), &
+         Wr(*), Wi(*), Pwrhor(*), Pwrhoi(*),  Zke(*)
       real(kind=8) :: val
       logical(C_BOOL)::accu
 
 !
 !      DIMENSION
-!     *     Cs(Ntotc), Si(Ntotc), Dphi(Ntotc), Wr(NN), Wi(NN),
-!     *     Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN),
-!     *     Qi(NN,NN), Zke(Ntotc)
+!     *     Cs(Ntotc), Si(Ntotc), Wr(NN), Wi(NN),
+!     *     Pwrhor(NN), Pwrhoi(NN),  Zke(Ntotc)
 !
       real(kind=8),parameter :: Zero  = 0.0d0, One = 1.0d0, Two = 2.0d0
 !
@@ -385,7 +379,7 @@ contains
                 call calc%crossData%setSharedValNs(calc%row, 1, Ktru, val)
              END IF
              IF (Keff.GT.0) THEN
-                val = Two*( Cs(I)*Wi(Ii)-Si(I)*Wr(Ii) )*Dphi(I)*B
+                val = Two*( Cs(I)*Wi(Ii)-Si(I)*Wr(Ii) )*calc%Dphi(I)*B
                 call calc%crossData%setSharedValNs(calc%row, 1, Keff, val)
              END IF
          else
@@ -422,9 +416,10 @@ contains
       IF (Lrmat.EQ.1) RETURN
       IF (Ksolve.EQ.2) RETURN
       IF (.not.calc%wantDerivs) RETURN
+      if (.not.allocated(calc%tr)) return
 !
-      CALL Zero_Array (TR, Ntriag)
-      CALL Zero_Array (TI, Ntriag)
+      calc%Tr(1,:) = 0.0d0
+      calc%Ti(1,:) = 0.0d0
 !
       Kl = 0
       DO K=1,Nent
@@ -443,16 +438,16 @@ contains
             DO I=1,Ntot
                DO J=1,I
                   Ij = Ij + 1
-                  Ti(Ij) = Ti(Ij) + Qr(Ij,Kl)*A + Qi(Ij,Kl)*B
-                  Tr(Ij) = Tr(Ij) + Qi(Ij,Kl)*A - Qr(Ij,Kl)*B
+                  calc%Ti(1, Ij) = calc%Ti(1, Ij) + calc%Qr(Ij,Kl)*A + calc%Qi(Ij,Kl)*B
+                  calc%Tr(1, Ij) = calc%Tr(1, Ij) + calc%Qi(Ij,Kl)*A - calc%Qr(Ij,Kl)*B
                END DO
             END DO
          END DO
       END DO
 !
-      CALL Derres_Cro (calc, spinInfo,  Igr, Tr, Ti, ipar)
+      CALL Derres_Cro (calc, spinInfo,  Igr, ipar)
 !
-      CALL Derext_Cro (calc, spinInfo, Igr, TR)
+      CALL Derext_Cro (calc, spinInfo, Igr)
 !
       RETURN
       END
@@ -461,7 +456,7 @@ contains
 ! --------------------------------------------------------------
 !
       SUBROUTINE Reactn (calc, spinInfo,  &
-         Wr, Wi, Pwrhor, Pwrhoi, Tr, Ti, Qr, Qi, Lrmat,   &
+         Wr, Wi, Pwrhor, Pwrhoi, Lrmat,   &
          igr, Zke, If_Zke, ipar)
 !
 ! *** PURPOSE -- GENERATE CROSS SECTION
@@ -485,12 +480,12 @@ contains
       
       real(kind=8) ::   &
          Wr(*), Wi(*), Pwrhor(*),   &
-         Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*), Qi(NN,*), Zke(*)
+         Pwrhoi(*),  Zke(*)
       real(kind=8) :: val
 !
 !      DIMENSION
 !     *   Wr(NN), Wi(NN),
-!     *   Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN), Qi(NN,NN)
+!     *   Pwrhor(NN), Pwrhoi(NN)
 !
        real(kind=8) :: Zero = 0.0d0, One = 1.0d0, Two = 2.0d00
 
@@ -585,9 +580,10 @@ contains
       IF (Lrmat.EQ.1) RETURN
       IF (Ksolve.EQ.2) RETURN
       IF (.not.calc%wantDerivs) RETURN
+      if (.not.allocated(calc%tr)) return
 !
-      CALL Zero_Array (Tr, Ntriag)
-      CALL Zero_Array (Ti, Ntriag)
+      calc%Tr(1,:) = 0.0d0
+      calc%Ti(1,:) = 0.0d0
 !
       IF (Next.GE.1) THEN
          DO Ll=1,Next
@@ -600,10 +596,10 @@ contains
                      DO I=1,Ntot
                         DO J=1,I
                            Ij = Ij + 1
-                           Ti(Ij) = Ti(Ij) - Qr(Ij,Kl)*Wr(Kl)   &
-                                           - Qi(Ij,Kl)*Wi(Kl)
-                           Tr(Ij) = Tr(Ij) - Qi(Ij,Kl)*Wr(Kl)   &
-                                           + Qr(Ij,Kl)*Wi(Kl)
+                           calc%Ti(1,Ij) = calc%Ti(1, Ij) - calc%Qr(Ij,Kl)*Wr(Kl)   &
+                                           - calc%Qi(Ij,Kl)*Wi(Kl)
+                           calc%Tr(1,Ij) = calc%Tr(1, Ij) - calc%Qi(Ij,Kl)*Wr(Kl)   &
+                                           + calc%Qr(Ij,Kl)*Wi(Kl)
                         END DO
                      END DO
                   END DO
@@ -612,9 +608,9 @@ contains
          END DO
       END IF
 !
-      CALL Derres_Cro (calc, spinInfo,  Igr, Tr, Ti, ipar)
+      CALL Derres_Cro (calc, spinInfo,  Igr, ipar)
 !
-      CALL Derext_Cro (calc, spinInfo, igr,  Tr)
+      CALL Derext_Cro (calc, spinInfo, igr)
 !
       RETURN
       END
@@ -623,7 +619,7 @@ contains
 ! --------------------------------------------------------------
 !
       SUBROUTINE Captur (calc, spinInfo,    &
-         Wr, Wi, Pwrhor, Pwrhoi, Tr, Ti, Qr, Qi,    &
+         Wr, Wi, Pwrhor, Pwrhoi,     &
          Lrmat,  igr,  Zke, If_Zke, ipar)
 !
 ! *** PURPOSE -- GENERATE CROSS SECTION
@@ -648,13 +644,12 @@ contains
       
       real(kind=8)::   &
          Wr(*), Wi(*),   &
-         Pwrhor(*), Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*),   &
-         Qi(NN,*),  Zke(*)
+         Pwrhor(*), Pwrhoi(*),  Zke(*)
       real(kind=8)::val
 !
 !      DIMENSION
-!     *   Cs(Ntotc), Si(Ntotc), Dphi(Ntotc), Wr(NN), Wi(NN),
-!     *   Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN), Qi(NN,NN)
+!     *   Cs(Ntotc), Si(Ntotc), Wr(NN), Wi(NN),
+!     *   Pwrhor(NN), Pwrhoi(NN)
 !
       real(kind=8),parameter :: Zero = 0.0d0, One = 1.0d0, Two = 2.0d0
 
@@ -704,9 +699,10 @@ contains
       IF (Lrmat.EQ.1) RETURN
       IF (Ksolve.EQ.2) RETURN
       IF (.not.calc%wantDerivs) RETURN
+      if (.not.allocated(calc%tr)) return
 !
-      CALL Zero_Array (Tr, Ntriag)
-      CALL Zero_Array (Ti, Ntriag)
+      calc%Tr(1,:) = 0.0d0
+      calc%Ti(1,:) = 0.0d0
 !
       Kl = 0
       DO K=1,Nent
@@ -720,8 +716,8 @@ contains
             DO I=1,Ntot
                DO J=1,I
                   Ij = Ij + 1
-                  Ti(Ij) = Ti(Ij) + Qr(Ij,Kl)*A + Qi(Ij,Kl)*B
-                  Tr(Ij) = Tr(Ij) + Qi(Ij,Kl)*A - Qr(Ij,Kl)*B
+                  calc%Ti(1,Ij) = calc%Ti(1,Ij) + calc%Qr(Ij,Kl)*A + calc%Qi(Ij,Kl)*B
+                  calc%Tr(1,Ij) = calc%Tr(1,Ij) + calc%Qi(Ij,Kl)*A - calc%Qr(Ij,Kl)*B
                END DO
             END DO
          END DO
@@ -741,8 +737,8 @@ contains
                   DO I=1,Ntot
                      DO J=1,I
                         Ij = Ij + 1
-                        Ti(Ij) = Ti(Ij) + Qr(Ij,Kl)*A + Qi(Ij,Kl)*B
-                        Tr(Ij) = Tr(Ij) + Qi(Ij,Kl)*A - Qr(Ij,Kl)*B
+                        calc%Ti(1,Ij) = calc%Ti(1,Ij) + calc%Qr(Ij,Kl)*A + calc%Qi(Ij,Kl)*B
+                        calc%Tr(1,Ij) = calc%Tr(1,Ij) + calc%Qi(Ij,Kl)*A - calc%Qr(Ij,Kl)*B
                      END DO
                   END DO
                END DO
@@ -750,16 +746,16 @@ contains
          END DO
       END IF
 !
-      CALL Derres_Cro (calc, spinInfo,  Igr, Tr, Ti, ipar)
+      CALL Derres_Cro (calc, spinInfo,  Igr, ipar)
 !
-      CALL Derext_Cro (calc, spinInfo, Igr, Tr)
+      CALL Derext_Cro (calc, spinInfo, Igr)
       RETURN
       END
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derres_Cro (calc, spinInfo, Igr, Tr, Ti, ipar)
+      SUBROUTINE Derres_Cro (calc, spinInfo, Igr, ipar)
 !
       use SammySpinGroupInfo_M
       use constn_common_m, only : Fourpi
@@ -770,7 +766,6 @@ contains
       real(kind=8) :: agoj
       integer :: Ntot, igr, ipar
       
-      real(kind=8) :: Tr(*), Ti(*)
       real(kind=8)::val
 
       real(kind=8),parameter :: Zero = 0.0d0, One = 1.0d0
@@ -799,10 +794,10 @@ contains
                   DO J=1,I
                      Ij = Ij + 1
                      IF (calc%Pi(Ij,M).NE.Zero) THEN
-                        S = S + calc%Pi(Ij,M)*Ti(Ij)*A
+                        S = S + calc%Pi(Ij,M)*calc%Ti(1, Ij)*A
                      END IF
                      IF (calc%Pr(Ij,M).NE.Zero) THEN
-                        S = S + calc%Pr(Ij,M)*Tr(Ij)*A
+                        S = S + calc%Pr(Ij,M)*calc%Tr(1, Ij)*A
                      END IF
                   END DO
                END DO
@@ -818,7 +813,7 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derext_Cro (calc, spinInfo, igr, Tr)
+      SUBROUTINE Derext_Cro (calc, spinInfo, igr)
 !
       use constn_common_m, only : Fourpi
       use SammyRExternalInfo_M
@@ -831,7 +826,6 @@ contains
       real(kind=8) :: Agoj
       integer :: Ntot, igr
       
-      real(kind=8) :: Tr(*)
       type(SammyRExternalInfo)::rextInfo
       type(RExternalFunction)::rext
       real(kind=8)::Parext(7)
@@ -865,10 +859,10 @@ contains
             IF (Ifl.GT.0) THEN
                val = 0.0d0
                IF (Nrext.EQ.5) val =    &
-                  - Tr(Ij)*B*Parext(5)/   &
+                  - calc%Tr(1,Ij)*B*Parext(5)/   &
                   (Su-Parext(1))
                IF (Nrext.EQ.7) val = val  &
-                  - Tr(Ij)*B* (Parext(5) +   &
+                  - calc%Tr(1,Ij)*B* (Parext(5) +   &
                                Parext(6)*Parext(1))/   &
                   (Su-Parext(1))
                call calc%crossData%setSharedValNs(calc%row, 1, Ifl, val)
@@ -877,32 +871,32 @@ contains
             IF (Ifl.GT.0) THEN
                val = 0.0d0
                IF (Nrext.EQ.5) val =     &
-                  - Tr(Ij)*B*Parext(5)/(Parext(2)-Su)
-               IF (Nrext.EQ.7) val = -Tr(Ij)*B*   &
+                  - calc%Tr(1,Ij)*B*Parext(5)/(Parext(2)-Su)
+               IF (Nrext.EQ.7) val = -calc%Tr(1,Ij)*B*   &
                   (Parext(5)+Parext(6)*Parext(2))/   &
                   (Parext(2)-Su)  + val
                 call calc%crossData%setSharedValNs(calc%row, 1, Ifl, val)
             END IF
             Ifl = rextInfo%getIflSammyIndex(3)            
             IF (Ifl.GT.0) THEN
-               val = Tr(Ij)*B
+               val = calc%Tr(1,Ij)*B
                call calc%crossData%setSharedValNs(calc%row, 1, Ifl, val)
             END IF
             Ifl = rextInfo%getIflSammyIndex(4)          
             IF (Ifl.GT.0) THEN
-               val = Tr(Ij)*B*Su
+               val = calc%Tr(1, Ij)*B*Su
                call calc%crossData%setSharedValNs(calc%row, 1, Ifl, val)
             END IF
             Ifl = rextInfo%getIflSammyIndex(5)
             IF (Ifl.GT.0) THEN
-               val = -Two*Tr(Ij)*B * dSQRT(Parext(5))*   &
+               val = -Two*calc%Tr(1,Ij)*B * dSQRT(Parext(5))*   &
                   dLOG( (Parext(2)-Su)/(Su-Parext(1)) )
                call calc%crossData%setSharedValNs(calc%row, 1, Ifl, val)
             END IF
             IF (rextInfo%getNrext().GT.5) THEN
                Ifl = rextInfo%getIflSammyIndex(6)
                IF (Ifl.GT.0) THEN
-                   val =   - Tr(Ij)*B*   &
+                   val =   - calc%Tr(1, Ij)*B*   &
                      ( (Parext(2)-Parext(1))+   &
                      Su*dLOG((Parext(2)-Su)/   &
                                    (Su-Parext(1))) )
@@ -910,7 +904,7 @@ contains
                END IF
                Ifl = rextInfo%getIflSammyIndex(7)
                IF (Ifl.GT.0) THEN
-                  val = Tr(Ij)*B*Su**2
+                  val = calc%Tr(1, Ij)*B*Su**2
                   call calc%crossData%setSharedValNs(calc%row, 1, Ifl, val)
                END IF
             END IF
diff --git a/sammy/src/cro/mcro6.f90 b/sammy/src/cro/mcro6.f90
index 8c17e91c4..2ad610a74 100755
--- a/sammy/src/cro/mcro6.f90
+++ b/sammy/src/cro/mcro6.f90
@@ -1,3 +1,6 @@
+module Xspfa_Xspsl_m
+private Ixamax, Xaxpy, Xdot, Xswap
+contains
 !
 !
 ! --------------------------------------------------------------
@@ -5,7 +8,7 @@
       SUBROUTINE Xspfa (Ap, N, Kpvt, Info)
       IMPLICIT DOUBLE PRECISION (A-H,O-Z)
       INTEGER N, Kpvt(*), Info
-      DIMENSION Ap(2,*)
+      real(kind=8)::Ap(2,*)
 !
 ! *** modified October 14, 1993, by NML to use for complex arrays
 !
@@ -755,3 +758,4 @@
       END IF
       RETURN
       END
+end module Xspfa_Xspsl_m
diff --git a/sammy/src/endf/VariedParameterInfo.cpp b/sammy/src/endf/VariedParameterInfo.cpp
index 8495fd8e9..684e21904 100644
--- a/sammy/src/endf/VariedParameterInfo.cpp
+++ b/sammy/src/endf/VariedParameterInfo.cpp
@@ -37,6 +37,7 @@ void VariedParameterInfo::getNumCombined(int & total, int & pup) const{
 void VariedParameterInfo::getNumRext(int & total, int & pup) const{
     total = pup = 0;
 
+
     for (int i = 0; i < resPar.getNumRext(); i++){
       sammy::SammyRExternalInfo * info = resPar.getRextInfo(i);      
       int iflr = 0;
@@ -66,10 +67,12 @@ void VariedParameterInfo::getNumRext(int & total, int & pup) const{
           default:
              throw std::runtime_error("Number of external R-Matrix parameters greater than 7 not implemented");
           }
-      }
-      if (iflr > 0){
-          total++;
-          if (covData.isPupedParameter(iflr - 1)) pup++;
+
+
+         if (iflr > 0){
+             total++;
+             if (covData.isPupedParameter(iflr - 1)) pup++;
+         }
       }
     }
 }
@@ -244,23 +247,29 @@ double VariedParameterInfo::getEchan(int grp, int nchan) const{
 
 int VariedParameterInfo::getNumUniqEchanIncludedChannels() const{
     std::vector<double> values;
-
-    for (int igr = 0; igr < resPar.getNumSpinGroups(); igr++){
-       sammy::SammySpinGroupInfo *info = resPar.getSpinGroupInfo(igr);
-       int ntot = info->getNumChannels();
-       int nentp = info->getNumEntryChannels();
-
-       for (int ichan = nentp; ichan < ntot; ichan++){
-           sammy::SammyChannelInfo * chanInfo  = info->getChannelInfo(ichan);
-           if (!chanInfo->getIncludeInCalc()) continue;
-
-           double echan = getEchan(igr, ichan);
-           if (std::find( values.begin(), values.end(), echan) == values.end()){
-               values.push_back(echan);
+    int num = 0;
+
+    for (int iso = 0; iso < resPar.getNumIso(); iso++){
+       values.clear();
+       for (int igr = 0; igr < resPar.getNumSpinGroups(); igr++){
+          sammy::SammySpinGroupInfo *info = resPar.getSpinGroupInfo(igr);
+          if (info->getIsotopeIndex() != iso) continue;
+          int ntot = info->getNumChannels();
+          int nentp = info->getNumEntryChannels();
+
+          for (int ichan = nentp; ichan < ntot; ichan++){
+              sammy::SammyChannelInfo * chanInfo  = info->getChannelInfo(ichan);
+              if (!chanInfo->getIncludeInCalc()) continue;
+
+              double echan = getEchan(igr, ichan);
+              if (std::find( values.begin(), values.end(), echan) == values.end()){
+                  values.push_back(echan);
+              }
            }
        }
+       num += (int)values.size();
     }
-    return (int)values.size();
+    return num;
 }
 
 double VariedParameterInfo::getBounds(int grp, int nchan, double Twomhb, int kwcoul, double Etac) const{
diff --git a/sammy/src/fin/mfin3.f90 b/sammy/src/fin/mfin3.f90
index 77babde1c..70c40b847 100644
--- a/sammy/src/fin/mfin3.f90
+++ b/sammy/src/fin/mfin3.f90
@@ -393,10 +393,15 @@ module fin3
            Ntotc, Kdecpl, Kenunc, Kkkgrp, Iunit)
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Ifits(*), Aaa(5), Iii(5)
+      IMPLICIT none
+      real(kind=8)::pken, Ddcov
+      integer::igroup, Ntotc, Kdecpl, Kenunc, Kkkgrp, Iunit
+      integer::Ifits(*)
+      real(kind=8)::Aaa(5), Z
+      integer::Iii(5)
       type(RMatResonance)::resonance
-      DATA Zero /0.0d0/
+      real(kind=8),parameter::Zero=0.0d0
+      integer:: I, Ix, Iz, Line, m, Max, Min, Nline, Ntotc2, Kddddd
 !
       Iz = 0
       Z  = Zero
@@ -404,6 +409,7 @@ module fin3
       IF (Kdecpl.NE.0 .OR. Kenunc.NE.0) THEN
          IF (Ddcov.NE.Zero) Kddddd = 1
       END IF
+      Aaa = 0.0d0
 !
 10000 FORMAT ('#', I2, 5F30.15, 6I2, F30.15)
 20000 FORMAT ('#', I2, 5F30.15, 5I2, I4, F30.15)
@@ -565,10 +571,10 @@ module fin3
                WRITE (Iunit,20000) Ix, Aaa, Iii, Igroup, Ddcov
             END IF
          ELSE
-            IF (Kkkgrp.EQ.50) THEN
+            IF (Kkkgrp.EQ.50) THEN             
                WRITE (Iunit,10000) Ix, Aaa, Iii, Igroup
             ELSE
-               Ix = Ix + 3
+               Ix = Ix + 3              
                WRITE (Iunit,20000) Ix, Aaa, Iii, Igroup
             END IF
          END IF
diff --git a/sammy/src/inp/minp15.f b/sammy/src/inp/minp15.f
index 6ec1cfb78..b071b1fa8 100644
--- a/sammy/src/inp/minp15.f
+++ b/sammy/src/inp/minp15.f
@@ -194,7 +194,6 @@ C
 
       END DO 
       
-      write(0,*)" Huh min15 ",resParData%getSpinIncident()
       CALL Organize_Bound_Etc (Bound)
       
       
diff --git a/sammy/src/rec/mrec0.f b/sammy/src/rec/mrec0.f
index 915f5015c..5363ede9a 100644
--- a/sammy/src/rec/mrec0.f
+++ b/sammy/src/rec/mrec0.f
@@ -21,6 +21,7 @@ C
       use mrec8_m
       use mdata_M
       use mrec2_m
+      use mrec3_m
       use mthe0_M
       use Tab1_M
       use mcro8_m
@@ -68,78 +69,29 @@ C     *** zero ***
 C
 C *** one ***
 C *** initialize difmax
-      call allocate_real_data(A_Idifma, Mres)
-      CALL Uuuset (A_Idifma  )
+      CALL Uuuset (zeroKCalc%driver%calculator%Difmax)
 C
 C *** two ***
       Maxnpu = Nemax
 C
 C - - - - - - - - - - - - - - - - - - - - - - - - - - - <
 C - - - - - - - - - - - - - - - - - - - - - - - - - - - <
-C
-C *** five ***
-      call allocate_real_data(A_Icrss, N3)
-C
-C - - - - - - - - - - - - - - - - - - - - - - <
-C *** six ***
-C
 C *** seven ***
-      call allocate_real_data(A_Ixden, Mres)
 C CALL Abpart
 C
 C *** eight ***
 C CALL Fixn
 C
-C *** nine ***
-      N = Ntotc
-      call allocate_real_data(A_Isinsq, N)
-      call allocate_real_data(A_Isinph, N)
-      call allocate_real_data(A_Idphi, N)
-      call allocate_real_data(A_Idpdr, N)
-      call allocate_real_data(A_Idsdr, N)
-      call allocate_real_data(A_Icc, N)
-      call allocate_real_data(A_Iss, N)
 C CALL Sinsin
-C
-C *** ten ***
-      N = Ntotc
-      call allocate_real_data(A_Ipsmal, N)
-      call allocate_real_data(A_Irootp, N)
-      call allocate_real_data(A_Linvr, N)
-      call allocate_real_data(A_Linvi, N)
-      N = NN
-      call allocate_real_data(A_Ixxxxr, N)
-      call allocate_real_data(A_Ixxxxi, N)
-      N = Ntotc*Ntotc
-      call allocate_real_data(A_Ixqr, N)
-      call allocate_real_data(A_Ixqi, N)
-      call allocate_real_data(A_Iyinv, 4*NN)
 C - - - - - - - - - - - - - - - - <
-C *** eleven ***
-      call allocate_real_data(A_Irmat, 4*NN)
-      call allocate_real_data(A_Iymat, 4*NN)
 C CALL Setr
 C CALL Yinvrs
 C CALL Setxqx
 C - - - - - - - - - - - - - - - - >
 C
 C *** twelve ***
-      N = Ncrsss - 2
-      IF (N.EQ.0) N = 1
-      call allocate_real_data(A_Itermf, N)
-      call allocate_real_data(A_Iterfx, N)
 C CALL Sectio
-C
-      N = NN*NN
-      call allocate_real_data(A_Iqr, N)
-      call allocate_real_data(A_Iqi, N)
-      call allocate_real_data(A_Ipxrr, N)
-      call allocate_real_data(A_Ipxri, N)
 C CALL Setqri
-C
-      N = Ncrsss*NN
-      call allocate_real_data(A_Itr, N)
-      call allocate_real_data(A_Iti, N)
 C CALL Settri
 C
 C *** thirteen ***
@@ -148,7 +100,8 @@ C *** thirteen ***
       CALL Eorder (A_Ienode, A_Iwnode , Node)
       Kadddc = 0
          Nnndrc = 1
-      CALL Grid (A_Icrss , A_Ienode, A_Iwnode,
+      CALL Grid (zeroKCalc%driver%xctCalc,
+     *   A_Ienode, A_Iwnode,
      *   A_Ietab2 , A_Isig2 , Node,
      *   Nemax, Nesave, Nreact)
       deallocate(A_Ienode)
diff --git a/sammy/src/rec/mrec2.f90 b/sammy/src/rec/mrec2.f90
index 79a0b1a45..93a99092b 100644
--- a/sammy/src/rec/mrec2.f90
+++ b/sammy/src/rec/mrec2.f90
@@ -5,7 +5,7 @@ contains
 !
 ! ------------------------------------------------------------------------
 !
-      SUBROUTINE Grid (Crss, Enode, Widnod,   &
+      SUBROUTINE Grid (xct, Enode, Widnod,   &
          Etab2, Sig2, Node, Nemax, Nesave, Nreact)
 !
 ! *** Generate an energy-grid suitable for producing pointwise cross sections.
@@ -18,10 +18,13 @@ contains
       use fixedi_m
       use fixedr_m
       use AllocateFunctions_m
-      use mrec6_m      
+      use mrec6_m
+      use mrec3_m
+      use XctCrossCalc_M
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
-      DIMENSION Crss(*), Enode(*), Widnod(*)
+      class(XctCrossCalc)::xct
+      DIMENSION Enode(*), Widnod(*)
       DIMENSION Sigmid(4)
       real(kind=8),allocatable,dimension(:)::Etab2, Esave, Esub
       real(kind=8),allocatable,dimension(:)::Sigsav(:,:), Sig2(:,:)
@@ -98,7 +101,7 @@ contains
             Etab2(Kpntp1) = Esub(1)
             IF (Kpoint.GT.0 .AND. Etab2(Kpntp1).LE.Etab2(Kpoint)) GO TO  140
 ! ***       CALCULATE CROSS SECTION AT NEXT ENERGY
-            CALL Sigmax (Etab2(Kpntp1), Sig2(1,Kpntp1), Crss)
+            CALL Sigmax (Etab2(Kpntp1), Sig2(1,Kpntp1), xct)
 ! ***       SAVE STARTING POINT (NO CONVERGENCE TESTS UNTIL 2ND POINT IS
 ! ***          GENERATED).
             Kpoint = Kpntp1
@@ -118,7 +121,7 @@ contains
                call reallocate_real_data_2d(Sig2, nreact, 0, max(Kpntp1, Kpoint), 1000)
                Etab2(Kpntp1) = Esub(Isub)
 ! ***          CALCULATE CROSS SECTION AT END OF SUB-INTERVAL.
-               CALL Sigmax (Etab2(Kpntp1), Sig2(1,Kpntp1), Crss)
+               CALL Sigmax (Etab2(Kpntp1), Sig2(1,Kpntp1), xct)
 !
 ! ***          DEFINE ENERGY AT MIDPOINT AND TEST FOR CONVERGENCE BASED
 ! ***             ON SHORT ENERGY INTERVAL.
@@ -136,7 +139,7 @@ contains
                IF ((Emid-Ea).LE.Eb*Tiny/2.0d0) GO TO 70
 !
 ! ***          DEFINE CROSS SECTION AT MIDPOINT.
-               CALL Sigmax (Emid, Sigmid, Crss)
+               CALL Sigmax (Emid, Sigmid, xct)
 !
    40          CONTINUE
 ! ***          test for convergence
diff --git a/sammy/src/rec/mrec3.f b/sammy/src/rec/mrec3.f90
similarity index 61%
rename from sammy/src/rec/mrec3.f
rename to sammy/src/rec/mrec3.f90
index 2e27395e3..b4851722e 100644
--- a/sammy/src/rec/mrec3.f
+++ b/sammy/src/rec/mrec3.f90
@@ -1,122 +1,115 @@
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Sigmax (Eee, Ssseee, Crss)
-C
-C *** PURPOSE -- Generate cross section Ssseee(I), at energy Eee, where
-C ***            I=1 means elastic, I=2 means absorption, I=3 means fission
-C
-C *** This file is modified from routines in segment XCT, to generate
-C ***    cross sections one energy at a time, with no derivatives wanted
-C
+module mrec3_m
+contains
+!
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Sigmax (Eee, Ssseee, xct)
+!
+! *** PURPOSE -- Generate cross section Ssseee(I), at energy Eee, where
+! ***            I=1 means elastic, I=2 means absorption, I=3 means fission
+!
+! *** This file is modified from routines in segment XCT, to generate
+! ***    cross sections one energy at a time, with no derivatives wanted
+!
       use oops_common_m
       use exploc_common_m
       use varyr_common_m
-      use ifsubs_common
       use xct4_m
-      use array_sizes_common_m, only : zeroKCalc
+      use XctCrossCalc_M
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
-C
-      DIMENSION Ssseee(*), Crss(*)
-C
+!
+      class(XctCrossCalc)::xct
+      DIMENSION Ssseee(*)
+!
       Su = Eee
       Squ = dSQRT(Su)
-C
-      Ks_Res = 2
-      Ifcap  = 1
-      Ifzzz  = 1
-      Ifext  = 1
-      Ifrad  = 1
-      Ifiso  = 1
-      Ifradt = 1
+!
       I = 0
-C *** generate cross sections pieces
-      CALL Zcross (zeroKCalc%driver%xctCalc, Nnndrc, I, Kount_Helmut)
-C
-C *** set the individual cross sections
-      CALL Indivi (Crss, Ssseee, Su)
-C
+! *** generate cross sections pieces
+      xct%ener = Eee
+      CALL Zcross (xct, Nnndrc, I)
+!
+! *** set the individual cross sections
+      CALL Indivi (xct, Ssseee, Su)
+!
       RETURN
       END
-C
-C
-C ______________________________________________________________________
-C
-      SUBROUTINE Indivi (Crss, Sig, Su)
-C
-C *** Purpose -- Set Sig(I) = the individual cross sections
-C
-C *** Note -- changes made here may also need to be made in sbroutine
-C ***         PRTCLR in mxct7.f
-C
+!
+!
+! ______________________________________________________________________
+!
+      SUBROUTINE Indivi (xct, Sig, Su)
+!
+! *** Purpose -- Set Sig(I) = the individual cross sections
+!
+! *** Note -- changes made here may also need to be made in sbroutine
+! ***         PRTCLR in mxct7.f
+!
       use fixedi_m
       use constn_common_m
       use EndfData_common_m
       use SammySpinGroupInfo_M
+      use XctCrossCalc_M
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
-C
-      DIMENSION Crss(Ncrsss,*), Sig(*)
+!
+      class(XctCrossCalc)::xct
+      DIMENSION Sig(*)
       type(SammySpinGroupInfo)::spinInfo
       DATA Zero /0.0d0/
-C
+!
       IF (Su.EQ.Zero) THEN
          Sig(1) = Zero
          Sig(2) = Zero
          IF (Ncrsss.GE.3) Sig(3) = Zero
          RETURN
       END IF
-C
-C *** first, set the cross sections:
+!
+! *** first, set the cross sections:
       Termn = Zero
       Terma = Zero
       Termf = Zero
       DO N=1,resParData%getNumSpinGroups() 
          call resParData%getSpinGroupInfo(spinInfo, N)
          abnSpin = spinInfo%getAbundance()
-         Termn = Termn + Crss(1,N)*AbnSpin
-         Terma = Terma + Crss(2,N)*AbnSpin
-cx         Termn = Termn + Crss(1,N)
-cx         Terma = Terma + Crss(2,N)
-         IF (Ncrsss.GE.3) THEN
-            DO I=1,Ncrsss-2
-cx                Termf = Termf + Crss(I+2,N)
-                Termf = Termf + Crss(I+2,N)*AbnSpin
-            END DO
-         END IF
+         Termn = Termn + xct%crossInternal(1, N, 0)*AbnSpin
+         Terma = Terma + xct%crossInternal(2, N, 0)*AbnSpin
+         DO I=3,Ncrsss
+           Termf = Termf + xct%crossInternal(I, N, 0)*AbnSpin
+         END do
       END DO
-C
+!
       Sig(1) = Termn*Fourpi/Su
       Sig(2) = Terma*Fourpi/Su
       IF (Ncrsss.GE.3) Sig(3) = Termf*Fourpi/Su
       RETURN
       END
-C
-C
-C --------------------------------------------------------------
-C
+!
+!
+! --------------------------------------------------------------
+!
       SUBROUTINE Uuuset (Difmax)
-C
-C *** PURPOSE -- GENERATE Uup, Udown, Nnpar, Difmax
-C *** modified from program Uset in mthe1
-C
+!
+! *** PURPOSE -- GENERATE Uup, Udown, Nnpar, Difmax
+! *** modified from program Uset in mthe1
+!
       use fixedi_m
       use ifwrit_m
       use SammyResonanceInfo_M
       use EndfData_common_m
       use RMatResonanceParam_M
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
-C
+!
       type(SammyResonanceInfo)::resInfo
       type(RMatResonance)::resonance
       type(SammySpinGroupInfo)::spinInfo
       type(RMatChannelParams)::channel
       type(SammyChannelInfo)::channelInfo
       DIMENSION Difmax(*)
-C
-C      DIMENSION Difmax(Nres)
+!
+!      DIMENSION Difmax(Nres)
       DATA Zero /0.0d0/, Two /2.0d0/
-C
+!
       Ks_Res = Ksolve
       Ipar = 0
       DO N=1,resParData%getNumResonances()
@@ -140,14 +133,14 @@ C
                         DO M=1,resonance%getNumChan()
                            G = G + dABS(resonance%getWidth(M))
                         END DO
-                     IF (Kscut.NE.0 .AND. channel%getL().EQ.0) G =
-     *                  G * Two
+                     IF (Kscut.NE.0 .AND. channel%getL().EQ.0) G = G * Two
                      Difmax(N) = G
                   END IF
                END IF
             END IF
          END IF
       END DO
-C
+!
       RETURN
       END
+end module mrec3_m
diff --git a/sammy/src/salmon/DerivativeList.cpp b/sammy/src/salmon/DerivativeList.cpp
index 1caac597f..588520980 100644
--- a/sammy/src/salmon/DerivativeList.cpp
+++ b/sammy/src/salmon/DerivativeList.cpp
@@ -217,7 +217,7 @@ namespace  sammy {
       if (gridData.getLength() > 0) {
           throw std::runtime_error("Can't add shared column if we already have data");
       }
-      if (getLength() > 0){
+      if (getLength() > 0){         
           throw std::runtime_error("Can't add shared column if we already have data");
       }
       sharedIndices.push_back(std::make_pair(col, iso));
diff --git a/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90 b/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90
index 6b19cf04d..c01245e96 100644
--- a/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90
+++ b/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90
@@ -166,6 +166,7 @@ subroutine DerivativeListHolder_addSharedColumn(this, col, iso)
     class(DerivativeListHolder)::this
     integer(C_INT)::col
     integer(C_INT)::iso
+    if (this%getIsotopeForShared(col).le.0) return
     call f_DerivativeListHolder_addSharedColumn(this%instance_ptr, col,iso-1)
 end subroutine
 subroutine DerivativeListHolder_setNotSetReturnsZero(this, empty)
diff --git a/sammy/src/sammy/CMakeLists.txt b/sammy/src/sammy/CMakeLists.txt
index 06282178c..3efca439c 100644
--- a/sammy/src/sammy/CMakeLists.txt
+++ b/sammy/src/sammy/CMakeLists.txt
@@ -392,7 +392,7 @@ APPEND_SET(SAMMY_SOURCES
             ../rec/mrec0.f
             ../rec/mrec1.f
             ../rec/mrec2.f90
-            ../rec/mrec3.f
+            ../rec/mrec3.f90
             ../rec/mrec4.f
             ../rec/mrec5.f
             ../rec/mrec6.f90
@@ -531,7 +531,6 @@ APPEND_SET(SAMMY_SOURCES
             ../blk/Over_common.f90
             ../blk/Oops_common.f90
             ../blk/Fixedi_common.f90
-            ../blk/ifsubs_common.f90
             ../blk/Ifwrit_common.f90
             ../blk/Exploc_common.f90
             ../blk/Samxxx_common.f90
diff --git a/sammy/src/the/CrossSectionCalcDriver_M.f90 b/sammy/src/the/CrossSectionCalcDriver_M.f90
index 0819414fe..c5ee33828 100644
--- a/sammy/src/the/CrossSectionCalcDriver_M.f90
+++ b/sammy/src/the/CrossSectionCalcDriver_M.f90
@@ -144,6 +144,7 @@ module CrossSectionCalcDriver_M
                 end if
                 allocate(this%xctCalc)
                 call this%xctCalc%initialize(resParData, covData, radFitFlags, nisoOur, needAngular, Itzero, Ilzero, doShiftRes)
+                if (niso.eq.1) this%xctCalc%separateIso = .false.
                 this%calculator => this%xctCalc
                 this%xctCalc%crossDataSelf%instance_ptr = this%calcDataSelf%instance_ptr
                 this%xctCalc%Kpolar = Kpolar
@@ -222,8 +223,9 @@ module CrossSectionCalcDriver_M
         class(CrossSectionCalcDriver)::this
         class(XctCrossCalc)::calc
 
-        integer::Ifc3,nreact, I, Ifdif
+        integer::Ifc3,nreact, I
         logical::doSelfIndicate
+        logical::addElimKapt
 
         doSelfIndicate = .false.
         if (associated(this%xctCalc)) doSelfIndicate = this%xctCalc%wantSelfIndicate
@@ -303,11 +305,14 @@ module CrossSectionCalcDriver_M
 
         !  differential elastic cross section .or. multiple-scattering
         ! corrections for which we need differential elastic
-        IF (this%Kcros.EQ.7 .OR. this%Kssmsc.GT.0) Ifdif = 1
-        IF (this%Kcros.EQ.11) Ifdif = 2   !  angular distribution for reaction cross section
+        IF (this%Kcros.EQ.7 .and. this%Kssmsc.GT.0) then
+            calc%Ifcros(1) = .true.
+        end if
 
-        if (associated(this%xctCalc))  this%xctCalc%Ifdif = Ifdif
-        if (associated(this%croCalc))  this%croCalc%Ifdif = Ifdif
+        addElimKapt = .false.
+        if (this%Kaptur.eq.1) addElimKapt = .true.
+        if (associated(this%croCalc)) this%croCalc%addElimKapt = addElimKapt
+        if (associated(this%xctCalc)) this%xctCalc%addElimKapt = addElimKapt
      end subroutine
 
 
diff --git a/sammy/src/the/CrossSectionCalculator_M.f90 b/sammy/src/the/CrossSectionCalculator_M.f90
index 6769fc53f..aeccd8aaf 100644
--- a/sammy/src/the/CrossSectionCalculator_M.f90
+++ b/sammy/src/the/CrossSectionCalculator_M.f90
@@ -16,6 +16,7 @@ module CrossSectionCalculator_M
      type(DerivativeHandler)::crossData     ! the cross section and derivative calculated for a given energy
      integer::row                           ! the row index for crossData (calcuated data for ener will be put here)
      logical::wantDerivs                    ! do we need derivatives
+     logical::onlyPupDerivs                 ! if wantDerivs is true, do we only need derivatives for the pup'ed parameters
      logical::hasPuped, hasParams           ! are there any pup'ed or varied parameters
      integer::reactType                     ! the type of reaction to calculate
      real(kind=8)::ener, enerSq             ! the energy and square at which to calculate the cross section
@@ -48,6 +49,7 @@ module CrossSectionCalculator_M
                                                ! Inum(Npr,1) =  fit flag, i.e. position (fortran counting) into covariance matrix
                                                ! Inum(Npr,2) = 1 -> energy, 2 elaststic channel, 3... other channels
                                                ! Inum(Npr,3) = the index of the resonance
+     real(kind=8),allocatable,dimension(:)::Difmax  ! if Difen for a given resonance is less than Difmax, we set  needAlphai true
      integer::inumSize   ! if filling Inum for a specific spin group, the number of parameters for that group
 
      logical::getAbundanceFromSpinGroup   ! should we get the abundance from the spin group instead of the isotope?
@@ -68,7 +70,8 @@ module CrossSectionCalculator_M
      procedure, pass(this) :: setRange => CrossSectionCalculator_setRange   ! set the range and reserve enough  space in crossData (the latter for efficiency only)
      procedure, pass(this) :: initialize => CrossSectionCalculator_initialize
      procedure, pass(this) :: destroy => CrossSectionCalculator_destroy
-     procedure, pass(this) :: calcCross => CrossSectionCalculator_calcCross     
+     procedure, pass(this) :: calcCross => CrossSectionCalculator_calcCross
+     procedure, pass(this) :: setDerivFlag  => CrossSectionCalculator_setDerivFlag
   end type CrossSectionCalculator
 
 contains
@@ -151,8 +154,6 @@ real(kind=8) function CrossSectionCalculator_getAbundance(this, igr) result(abun
    call this%resData%getSpinGroupInfo(info, igr)
    if (this%getAbundanceFromSpinGroup) then
       abund = info%getAbundance()
-
-       isoN =  info%getIsotopeIndex()
    else
      isoN =  info%getIsotopeIndex()
      abund = this%resData%getAbundanceByIsotope(isoN)
@@ -170,9 +171,12 @@ subroutine CrossSectionCalculator_setWantDeriv(this, wantDerivs)
    logical::wantDerivs
 
    this%wantDerivs = .false.
+   this%onlyPupDerivs = .false.
    if (this%hasPuped)  this%wantDerivs = .true.
    if (wantDerivs) then
       if (this%hasParams) this%wantDerivs = .true.
+   else
+      if (this%hasPuped) this%onlyPupDerivs = .true.
    end if
 end subroutine
 
@@ -263,6 +267,20 @@ subroutine CrossSectionCalculator_getParamPerSpinGroup(this, ires, igr,  fillIt)
        END DO
     end do    
 end subroutine
+
+logical function CrossSectionCalculator_setDerivFlag(this, iflag, doSolve) result(set)
+    class(CrossSectionCalculator) :: this
+    integer::iflag
+    logical::doSolve
+
+    set = .false.
+    if (iflag.le.0) return
+    set = .true.
+    if (doSolve) return
+    set = .false.
+    if (this%covariance%isPupedParameter(iflag)) set = .true.
+end  function CrossSectionCalculator_setDerivFlag
+
 !!
 !! Determine which derivatives need to be calculated,
 !! i.e. resonances only, radii, ...
@@ -278,20 +296,31 @@ subroutine CrossSectionCalculator_Which_Derivs(this)
   integer::Itzero, Ilzero
   integer::ig, ich, is
   type(SammyRExternalInfo)::rextInfo
+  logical::set
 
+   this%Ifext = .false.
+   this%Ifiso = .false.
+   this%Ifrad = .false.
+   this%Ifradt = .false.
+   this%Ifzzz = .false.
+   if (.not.this%wantDerivs) return
 
-   if (this%Itzero.gt.0) this%Ifzzz = .true.
-   if (this%Ilzero.gt.0) this%Ifzzz = .true.
+   set = this%setDerivFlag(this%Itzero, this%wantDerivs)
+   if (set) this%Ifzzz = .true.
+   set = this%setDerivFlag(this%Ilzero, this%wantDerivs)
+   if (set) this%Ifzzz = .true.
 
    DO ig=1,this%resData%getNumSpinGroups()
       call this%resData%getSpinGroupInfo(spinInfo, ig)
       DO Ich=1,spinInfo%getNumChannels()
-         if (this%radiusData%getTrueFitFlag(Ig, Ich).gt.0) then
+         set = this%setDerivFlag(this%radiusData%getTrueFitFlag(Ig, Ich), this%wantDerivs)
+         if (set) then
             this%Ifrad = .true.
             this%Ifradt = .true.
          end if
          if (this%Ifrad.and.this%Ifradt) exit
-         if(this%radiusData%getEffFitFlag(Ig, Ich).gt.0) then
+         set = this%setDerivFlag(this%radiusData%getEffFitFlag(Ig, Ich), this%wantDerivs)
+         if(set) then
             this%Ifrad = .true.
          end if
          if (this%Ifrad.and.this%Ifradt) exit
@@ -301,7 +330,8 @@ subroutine CrossSectionCalculator_Which_Derivs(this)
 
    do is = 1, this%resData%getNumIso()
       call this%resData%getIsoInfo(isoInfo, Is)
-      if (isoInfo%getFitOption().gt.0) then
+      set = this%setDerivFlag(isoInfo%getFitOption(), this%wantDerivs)
+      if (set) then
          this%Ifiso = .true.
          exit
       end if
@@ -313,7 +343,8 @@ subroutine CrossSectionCalculator_Which_Derivs(this)
         if (.not.this%resData%hasRexInfo(ig, Ich)) cycle
         call this%resData%getRextInfoByGroup(rextInfo, ig, Ich)
         DO Is = 1, rextInfo%getNrext()
-           if( rextInfo%getIflSammyIndex(Is).gt.0) then
+           set = this%setDerivFlag(rextInfo%getIflSammyIndex(Is), this%wantDerivs)
+           if( set) then
               this%Ifext = .true.
               exit
            end if
@@ -352,6 +383,8 @@ subroutine CrossSectionCalculator_setEnergyIndependent(this, reactType, Twomhb,
     this%reactType = reactType
     call this%setZke(Twomhb, Etac)
     call this%setEchan()
+
+    call this%Which_Derivs()
 end subroutine
 !!
 !! Set the range and number of energy points
@@ -403,6 +436,7 @@ subroutine CrossSectionCalculator_initialize(this, pars, cov, rad, niso, needAng
     logical(C_BOOL)::countCombined
 
     this%wantDerivs = .false.
+    this%onlyPupDerivs = .false.
     this%reactType = 0
     this%hasPuped = .false.
     this%hasParams = .false.
@@ -448,6 +482,8 @@ subroutine CrossSectionCalculator_initialize(this, pars, cov, rad, niso, needAng
     call reallocate_real_data_2d(this%Zeta, ntot-1, 0, pars%getNumSpinGroups(), 0)
     call reallocate_real_data_2d(this%Echan, ntot-1, 0, pars%getNumSpinGroups(), 0)
 
+    call allocate_real_data(this%Difmax, pars%getNumResonances())
+
    itmp = 0
    ires = 0
    do n = 1, this%resData%getNumSpinGroups()
@@ -466,7 +502,6 @@ subroutine CrossSectionCalculator_initialize(this, pars, cov, rad, niso, needAng
    this%Ifrad = .false.
    this%Ifradt = .false.
    this%Ifzzz = .false.
-   call this%Which_Derivs()
 end subroutine
 !!
 !! Destroy all resources
@@ -476,6 +511,7 @@ subroutine CrossSectionCalculator_destroy(this)
     deallocate(this%Zke)
     deallocate(this%Zeta)
     deallocate(this%Echan)
+    deallocate(this%Difmax)
     if(allocated(this%Inum)) deallocate(this%Inum)
 end subroutine
 end module CrossSectionCalculator_m
diff --git a/sammy/src/the/ZeroKCrossCorrections_M.f90 b/sammy/src/the/ZeroKCrossCorrections_M.f90
index 575c19ea8..ccd575a71 100644
--- a/sammy/src/the/ZeroKCrossCorrections_M.f90
+++ b/sammy/src/the/ZeroKCrossCorrections_M.f90
@@ -37,6 +37,7 @@ module ZeroKCrossCorrections_M
       procedure, pass(this) :: AddParam => ZeroKCrossCorrections_AddParam  ! add the paramagnetic cross section. This function uses SAMMY global parameters
   end type
 
+  private A_Interp
 contains
   !!
   !! Reconstruct the 0K cross section
@@ -143,12 +144,14 @@ contains
       integer::is, id
 
       if (this%moreCorrections) return  ! don't need to set theory yet
-      !if (.not.this%summedOverIsotopes) then
-      !    write(0,*)" Expected only one istope or sum over isotopes completed"
-      !    stop
-      !end if
+      if (.not.this%summedOverIsotopes) then
+          write(6,*)" Expected only one istope or sum over isotopes completed"
+          write(21,*)" Expected only one istope or sum over isotopes completed"
+          stop
+      end if
       if (nnsig.ne.this%driver%calcData%getNnnsig()) then
-          write(0,*)" Number of cross sections do not agree "
+          write(6,*)" Number of cross sections do not agree "
+          write(21,*)" Number of cross sections do not agree "
           stop
       end if
       do id = 1, this%dataStart -1
@@ -169,8 +172,9 @@ contains
   !!  - userGrid  grid from which to calculate the emin and emax value
   !!  - expData needed as an argument for grid and userGrid to get the enery
   !!  - covariance covariance data, needed to find the position for the derivatives
+  !!  - wantDeriv do we need derivatives (i.e. are we solving).
   !!
-  subroutine ZeroKCrossCorrections_applyNorm(this, grid, expData, covariance)
+  subroutine ZeroKCrossCorrections_applyNorm(this, grid, expData, covariance, wantDeriv)
      use lbro_common_m, only : Ynrmbk
      use fixedi_m, only : Numnbk, Numbgf
      use ifwrit_m, only : Ksolve
@@ -184,51 +188,38 @@ contains
      type(SammyGridAccess)::grid
      type(GridDataList)::expData
      type(CovarianceData)::covariance
+     logical::wantDeriv
 
      integer::numEl
      integer::ipos, iel, itot, in
      real(kind=8)::ener
 
-     logical::wantDeriv
+     logical::wantDerivLocal, set
 
 
      if (.not.Ynrmbk) return ! no correction to apply
      if ( Numnbk.eq.0.and.Numbgf.eq.0) return  ! no normalization to apply
      if (this%moreCorrections) return  ! don't need apply normalization and background yet
 
-     !if (.not.this%summedOverIsotopes) then
-     !    write(0,*)" Expected only one istope or sum over isotopes completed"
-     !    stop
-     !end if
+     if (.not.this%summedOverIsotopes) then
+         write(6,*)" Expected only one istope or sum over isotopes completed"
+         write(21,*)" Expected only one istope or sum over isotopes completed"
+         stop
+     end if
 
      numEl = grid%getNumEnergies(expData)
      ipos  = 0
-     wantDeriv = this%driver%getWantDerivs()
-     if (.not.wantDeriv) then
-        if (ksolve.ne.2) then
-           if (allocated(I_Iflnbk)) then
-              if (sum(I_Iflnbk).gt.0) wantDeriv = .true.
-           end if
-           if (allocated(I_Iflbgf)) then
-             if (sum(I_Iflbgf).gt.0) wantDeriv = .true.
-           end if
-        else
-           if (allocated(I_Iflnbk)) then
-              do in = 1, size(I_Iflnbk)
-                 if ( I_Iflnbk(in).le.0) cycle
-                 if ( covariance%isPupedParameter(I_Iflnbk(in))) then
-                     wantDeriv = .true.
-                     exit
-                 end if
-              end do
-           end if
+     wantDerivLocal = this%driver%calculator%wantDerivs
+     if (.not.wantDerivLocal) then
+        if (allocated(I_Iflnbk)) then
+           do in = 1, size(I_Iflnbk)
+             set = this%driver%calculator%setDerivFlag(I_Iflnbk(in), wantDeriv)
+             if (set) wantDerivLocal = .true.
+           end do
            if (allocated(I_Iflbgf)) then
               do in = 1, size(I_Iflbgf)
-                 if ( I_Iflbgf(in).le.0) cycle
-                 if ( covariance%isPupedParameter(I_Iflbgf(in))) then
-                     wantDeriv = .true.
-                     exit
-                 end if
+                 set = this%driver%calculator%setDerivFlag(I_Iflbgf(in), wantDeriv)
+                 if (set) wantDerivLocal = .true.
               end do
            end if
         end if
@@ -258,8 +249,9 @@ contains
   !!  - userGrid  grid from which to calculate the emin and emax value
   !!  - expData needed as an argument for grid and userGrid to get the enery
   !!  - covariance covariance data, needed to find the position for the derivatives
+  !!  - wantDeriv do we need derivatives (i.e. are we solving).
   !!
-  subroutine ZeroKCrossCorrections_convertToTrans(this,  grid, expData, covariance)
+  subroutine ZeroKCrossCorrections_convertToTrans(this,  grid, expData, covariance, wantDeriv)
       use CovarianceData_M
       use GridData_M
       use convert_to_transmission_m
@@ -270,10 +262,11 @@ contains
       type(SammyGridAccess)::grid
       type(GridDataList)::expData
       type(CovarianceData)::covariance
+      logical::wantDeriv
 
       integer::iel, numEl, itot, ipos
       real(kind=8)::ener
-      logical::wantDeriv
+      logical::wantDerivLocal, set
 
       if (.not.this%wantTrans) return  ! don't need to do transformation to transmission yet
 
@@ -281,18 +274,12 @@ contains
       ipos  = 0
       itot = 0
 
-      wantDeriv = this%driver%getWantDerivs()
-      if (.not.wantDeriv.and.Kvthck.gt.0) then
-         if (ksolve.ne.2) then
-            wantDeriv = .true.
-         else
-           if ( covariance%isPupedParameter(Kvthck)) then
-               wantDeriv = .true.
-           end if
-         end if
-      end if
+      wantDerivLocal = wantDeriv
+      set = this%driver%calculator%setDerivFlag(Kvthck, wantDeriv)
+      if (set) wantDerivLocal = .true.
+
       itot = 0
-      if (wantDeriv) itot = covariance%getNumTotalParam()
+      if (wantDerivLocal) itot = covariance%getNumTotalParam()
 
       do iel = 1, numEl
          ener = grid%getEnergy(iel, expData)
@@ -314,26 +301,67 @@ contains
   !!  - userGrid  grid from which to calculate the emin and emax value
   !!  - expData needed as an argument for grid and userGrid to get the enery
   !!  - covariance covariance data, needed to find the position for the derivatives
+  !!  - wantDeriv do we need derivatives (i.e. are we solving).
   !!
-  subroutine ZeroKCrossCorrections_Fix_Eta(this,  grid, expData, covariance)
+  subroutine ZeroKCrossCorrections_Fix_Eta(this,  grid, expData, covariance, wantDeriv)
       use CovarianceData_M
       use GridData_M
-      use exploc_common_m, only :  I_Iflmsc
-      use ifwrit_m, only : Ksolve, Kjetan
-      use fixedr_m, only : Etanuu
+      use exploc_common_m, only :  I_Iflmsc, A_Iprmsc, A_Ietaee
+      use ifwrit_m, only : Ksolve, Keffis, Kefcap, Kfake, Kjetan, Mjetan
+      use fixedr_m, only : Effcap, Efffis, Etanuu
       class(ZeroKCrossCorrections)::this
       type(SammyGridAccess)::grid
       type(GridDataList)::expData
       type(CovarianceData)::covariance
+      logical::wantDeriv
 
+      real(kind=8),pointer,dimension(:)::A_Ietax
       integer::iel, numEl, itot, ipos
       real(kind=8)::ener
-      logical::wantDeriv
-      integer::niso, is, id
-      real(kind=8)::Sigma, F, A, v1, v2
-      integer::iflKjetan
-
-
+      logical::wantDerivLocal
+      integer::niso, is, id, isize, K1, K2, k
+      real(kind=8)::Sigma, F, A, v1, v2, A1, A2, A3, Etan, D, C
+      real(kind=8)::sigFis, sigAbs, sigEta, val
+      real(kind=8)::dsigFis, dsigAbs, dsigEta
+      integer::ifl
+      logical::set
+
+
+      !
+      ! eta =  fis_det_eff * sigma_fis/(Sigma_cap *cap_det_eff + fis_det_eff * sigma_fis) *etanu
+      ! where etan can be energy dependent
+      !  fis_det_eff, cap_det_eff (detector efficiencies) can be varied, etanu can be varied
+      !
+      ! At the beginning of the routine sigma_fis is stored in this%driver%calcData%getDataNs(*, 1, 0 , iso)
+      !                                 sigma_abs is stored in this%driver%calcData%getDataNs(*, 2, 0 , iso)
+      ! and Nnnsig=2
+      ! at the end eta is stored in
+      !   this%driver%calcData%getDataNs(*, 1, 0 , iso)
+      ! and Nnnsig=1
+
+      isize = size(A_Iprmsc)
+      A_Ietax => A_Iprmsc(Kjetan:isize)
+      if (size(A_Ietax).lt.mjetan) then
+          STOP '[STOP in ZeroKCrossCorrections_Fix_Eta A_Iprmsc is too small ]'
+      end if
+      wantDerivLocal = this%driver%calculator%wantDerivs
+      if (.not.wantDerivLocal) then
+          IF (Kefcap.NE.0) THEN
+            set = this%driver%calculator%setDerivFlag(I_Iflmsc(Kefcap), wantDeriv)
+            if (set) wantDerivLocal = .true.
+         end if
+         IF (Keffis.NE.0) THEN
+           set = this%driver%calculator%setDerivFlag(I_Iflmsc(Keffis), wantDeriv)
+           if (set) wantDerivLocal = .true.
+         end if
+         do k = 1,Mjetan
+            Ifl = K+Kjetan-1
+            if (Ifl.gt.0.and.ifl.le.size(I_Iflmsc)) then
+               set = this%driver%calculator%setDerivFlag(I_Iflmsc(Ifl), wantDeriv)
+               if (set) wantDerivLocal = .true.
+            end if
+         end do
+      end if
 
       numEl = grid%getNumEnergies(expData)
       ipos  = 0
@@ -341,55 +369,152 @@ contains
       niso = this%driver%calcData%getNumberIsotopes()
 
       if (this%driver%calcData%getNnnsig().lt.2) then
-         write(0,*)" Need Nnnsig=2 if calculating eta"
+         write(6,*)" Need Nnnsig=2 if calculating eta"
+         write(21,*)" Need Nnnsig=2 if calculating eta"
          stop
       end if
 
-      wantDeriv = this%driver%getWantDerivs()
-      iflKjetan =  Kjetan
-      if (iflKjetan.ne.0) then
-         iflKjetan = I_Iflmsc(Kjetan)
-      end if
-      if (.not.wantDeriv.and.iflKjetan.gt.0) then
-         if (ksolve.ne.2) then
-            wantDeriv = .true.
-         else
-           if ( covariance%isPupedParameter(iflKjetan)) then
-               wantDeriv = .true.
-           end if
-         end if
-      end if
-
-      if (wantDeriv) itot = covariance%getNumTotalParam()
+      if (wantDerivLocal) itot = covariance%getNumTotalParam()
 
       do iel = 1, numEl
          ener = grid%getEnergy(iel, expData)
          if (ener.lt.0.0d0.and..not.this%wantNeg) cycle
+
          ipos = ipos + 1
 
+         IF (Mjetan.GT.1) THEN
+            Etan = A_Interp (dAbs(ener), A_Ietax, A_Ietaee, Mjetan, A1, A2, K1,K2)
+         ELSE
+              Etan = Etanuu
+              A1 = 1.0d0
+              A2 = 0.0d0
+              K1 = 1
+              K2 = 0
+         END IF
+
          do is = 1, niso
-            Sigma = this%driver%calcData%getDataNs(ipos, 1, 0 , is)
-            F = this%driver%calcData%getDataNs(ipos, 2, 0 , is)
-            A = Sigma - F
+            sigFis = this%driver%calcData%getDataNs(ipos, 1, 0 , is)
+            sigAbs = this%driver%calcData%getDataNs(ipos, 2, 0 , is)
+
+            if(sigFis.eq.0.0d0.and.sigAbs.eq.0.0d0) cycle
+
+            IF (Kefcap.EQ.0) THEN
+               A3 = sigFis/sigAbs
+               sigEta = A3*Etan
+            ELSE
+               C = (sigAbs-sigFis)*Effcap
+               F = sigFis*Efffis
+               A3 = F/(F+C)
+               sigEta = A3*Etan
+            END IF
+            val = sigEta
+            if (ener.lt.0) val = -val
+            call this%driver%calcData%addData(ipos, 0, Is, val)
+
             do id = 1, itot
-                v1 = this%driver%calcData%getDataNs(ipos, 1, id , is)
-                v2 = this%driver%calcData%getDataNs(ipos, 2, id , is)
-                v1 =  Etanuu * ( v2*(A/Sigma) - v1*(F/Sigma) )/Sigma
-                if (v1.ne.0.0d0) then
-                    call this%driver%calcData%addDataNs(ipos, 1, id, is, v1)
-                end if
+                dsigFis = this%driver%calcData%getDataNs(ipos, 1, id , is)
+                dsigAbs = this%driver%calcData%getDataNs(ipos, 2, id , is)
+
+                if (dsigFis.eq.0.0d0.and.dsigAbs.eq.0.0d0) cycle
+
+                IF (Kefcap.EQ.0) THEN
+                    dsigEta=Etan*(dsigFis-dsigAbs*sigFis/sigAbs)/sigAbs                   
+                else
+                   D = sigAbs*Effcap + sigFis*(Efffis-Effcap)
+                   dsigEta = Etan/D * ( dsigFis*Efffis -   &
+                      sigFis*Efffis/D* (dsigAbs*Effcap +   &
+                                        dsigFis*(Efffis-Effcap)) )
+                END IF
+                val = dsigEta
+                if (ener.lt.0) val = -val
+                call this%driver%calcData%addData(ipos, Id, Is, val)            
             end do
 
-            if (wantDeriv.and.iflKjetan.gt.0) then
-               v1 = Sigma/Etanuu
-               call this%driver%calcData%addDataNs(ipos, 1, iflKjetan, is, v1)
+            IF (Kefcap.NE.0) THEN
+               Ifl = I_Iflmsc(Kefcap)
+               IF (Ifl.GT.0) THEN
+                  D = F + C
+                  val =  - sigEta*(sigAbs-sigFis)/D
+                  call this%driver%calcData%addData(ipos, ifl, Is, val)                 
+               END IF
+               Ifl = I_Iflmsc(Keffis)
+               IF (Ifl.GT.0) THEN
+                  D = F + C
+                  val =sigEta*C/(D*Efffis)
+                  call this%driver%calcData%addData(ipos, ifl, Is, val)
+               END IF
+            END IF
+            Ifl = K1+Kjetan-1
+            if (Ifl.gt.0.and.ifl.le.size(I_Iflmsc)) then
+               Ifl = I_Iflmsc(Ifl)
+            else
+               Ifl = 0
+            end if
+            IF (Ifl.GT.0) THEN
+                val =  A1*A3
+                call this%driver%calcData%addData(ipos, Ifl, Is, val)
+            END IF            
+            if (K2.gt.0)  then
+              Ifl = K2+Kjetan-1
+              if (Ifl.gt.0.and.ifl.le.size(I_Iflmsc)) then
+                 Ifl = I_Iflmsc(Ifl)
+              else
+                 Ifl = 0
+              end if           
+              IF (Ifl.GT.0) THEN
+                 val = A2 * A3
+                 call this%driver%calcData%addData(ipos, Ifl, Is, val)
+              END IF
             end if
          end do
      end do
+     call this%driver%calcData%setNnsig(1)
   end subroutine
 
-
-  subroutine ZeroKCrossCorrections_AddParam(this,  grid, expData, covariance)
+  Double Precision Function A_Interp (Su, Etanux, Etaeee, Mjetan,   &
+     A1, A2, Keta1, Keta2)
+!
+! *** Purpose -- Find A_Interp = value of Etanux (nu) at energy Su
+! ***               for this run.
+!
+  real(kind=8):: Etanux(*), Etaeee(*)
+  real(kind=8)::Su, A1, A2
+  integer::Mjetan, Keta1, Keta2
+  real(kind=8)::A, De, E1, E2
+  integer::K
+
+  IF (Su.LT.Etaeee(1)) THEN
+     A_Interp = Etanux(1)
+     Keta1 = 1
+     Keta2 = 0
+     A1 = 1.0d0
+     A2 = 0.0d0
+     RETURN
+  END IF
+  DO K=2,Mjetan
+     IF (Su.LT.Etaeee(K)) GO TO 10
+  END DO
+  A_Interp = Etanux(Mjetan)
+     Keta1 = Mjetan
+     Keta2 = 0
+     A1 = 1.0d0
+     A2 = 0.0d0
+  RETURN
+10 CONTINUE
+  E1 = Etaeee(K-1)
+  E2 = Etaeee(K  )
+  De = E2 - E1
+  A1 = (E2-Su)/De
+  A2 = (Su-E1)/De
+  A = A1*Etanux(K) + A2*Etanux(K-1)
+  A_Interp = A
+  Keta1 = K - 1
+  Keta2 = K
+  RETURN
+  END function
+
+
+  subroutine ZeroKCrossCorrections_AddParam(this,  grid, expData, covariance, wantDeriv)
      use SammyGridAccess_M
      use paramagnetic_cross_m
      use GridData_M
@@ -401,11 +526,12 @@ contains
      type(SammyGridAccess)::grid
      type(GridDataList)::expData
      type(CovarianceData)::covariance
+     logical::wantDeriv
 
      integer::iel, numEl, ipos, iso, numIso, ns
      real(kind=8)::ener, abund, pmc
      integer::ourIso, ii, Ifl, i
-     logical::wantPara, wantDeriv
+     logical::wantPara, wantDerivLocal, set
      logical(C_BOOL)::accu
 
 
@@ -424,20 +550,13 @@ contains
     call this%driver%calcData%setAccumulate(accu)
     call this%driver%calcDataSelf%setAccumulate(accu)
 
-    wantDeriv = this%driver%getWantDerivs()
-
-    if (.not.wantDeriv) then ! check for pup'ed
+     wantDerivLocal = wantDeriv
+    if (.not.wantDerivLocal) then ! check for pup'ed
         do ii = 1,Numpmc
            do i = 1, 4
              Ifl = I_Iflpmc(i, ii)
-             if (Ifl.le.0) cycle
-             if (ksolve.ne.2) then
-                  wantDeriv = .true.
-             else
-                if ( covariance%isPupedParameter(Ifl)) then
-                    wantDeriv = .true.
-                end if
-             end if
+             set = this%driver%calculator%setDerivFlag(ifl, wantDeriv)
+             if (set) wantDerivLocal = .true.
            end do
          end do
      end if
@@ -459,7 +578,7 @@ contains
               call this%driver%calcDataSelf%addDataNs(ipos, 1, 0, ii, pmc)
            end if
 
-           if (wantDeriv) then
+           if (wantDerivLocal) then
                if (this%driver%calculator%reactType.eq.1) then
                   call Dddpmc (A_Iprpmc, I_Iflpmc, I_Isopmc, Numpmc,  iso, ii, abund,  ener, this%driver%calcData, ipos,  Ns)
                else if (this%driver%calculator%reactType.eq.8) then
diff --git a/sammy/src/the/mthe0.f90 b/sammy/src/the/mthe0.f90
index 7a05f90ce..73befac0a 100644
--- a/sammy/src/the/mthe0.f90
+++ b/sammy/src/the/mthe0.f90
@@ -97,6 +97,8 @@ module mthe0_M
       call Orgbro  ! set up which segment to call and some other global parameters
 
       call setup_zeroK   ! initialize the object that does the 0k reconstruction
+      ! todo: Change the code so we don't actually allocate A_Idifma and Difmax
+      zeroKCalc%driver%calculator%Difmax(1:Nres) = A_Idifma(1:Nres)
 
       ! set up the energy grid on which the data are calculated
       call grid%initialize()
@@ -129,15 +131,21 @@ module mthe0_M
          STOP '[STOP in Samthe_0 in the/mthe0.f]'
       END If
 
-      if (kcros.eq.6.and.Krmatx.ne.2) then
-          call zeroKCalc%Fix_Eta(grid, expData, covData) ! calculate eta if needed
+      if (Ksolve.eq.2) then
+          wantDeriv = .false.
+      else
+         wantDeriv = .true.
+      end if
+
+      if (kcros.eq.6) then
+          call zeroKCalc%Fix_Eta(grid, expData, covData, wantDeriv) ! calculate eta if needed
       end if
 
       if (Kfake.ne.1) then   ! normal  additional correction as needed
-         call zeroKCalc%AddParam(grid, expData, covData)       ! add paramagnetic cross section if desired
-         call zeroKCalc%addFile3(grid, expData)                ! add file 3 data if needed         
-         call zeroKCalc%convertToTrans(grid, expData, covData) ! convert to transmission if needed
-         call zeroKCalc%applyNorm(grid, expData, covData)      ! apply normalization and background if needed
+         call zeroKCalc%AddParam(grid, expData, covData, wantDeriv)       ! add paramagnetic cross section if desired
+         call zeroKCalc%addFile3(grid, expData)                           ! add file 3 data if needed
+         call zeroKCalc%convertToTrans(grid, expData, covData, wantDeriv) ! convert to transmission if needed
+         call zeroKCalc%applyNorm(grid, expData, covData, wantDeriv)      ! apply normalization and background if needed
       end if
       call zeroKCalc%setTheory(A_Ith, Nnnsig)               ! set theory if no further work is required
       if (Kfake.eq.1) then
diff --git a/sammy/src/the/mthe1.f90 b/sammy/src/the/mthe1.f90
index 294df9b36..f6bdbddda 100644
--- a/sammy/src/the/mthe1.f90
+++ b/sammy/src/the/mthe1.f90
@@ -8,13 +8,10 @@ module mthe1_m
 !
 ! *** PURPOSE -- GENERATE   Nnpar, and Difmax
 !
-      use fixedi_m, only : Nfpres, Numcro, Nvpres, Ntotc,  &
-                           needResDerivs
+      use fixedi_m, only :  Numcro
       use fixedr_m, only : Emax, Emin
       use ifwrit_m, only : Kdecpl, Kscut, Ksolve, ktzero, Ndat
       use broad_common_m, only : Dopple, Iesopr
-      use templc_common_m, only : I_Inotu
-      use AllocateFunctions_m
       use EndfData_common_m
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
@@ -52,7 +49,6 @@ module mthe1_m
       END If
 !
          Napres = 0
-         needResDerivs = .false.
          havePups = .false.
          icomp = 0
 ! ***    Use cutoff on derivatives
@@ -62,8 +58,6 @@ module mthe1_m
          G = Zero
          ntotres = 0
          IF (resParData%getNumResonances().GT.0) THEN
-            call allocate_integer_data(I_Inotu,     &
-                      covData%getNumTotalParam())
             DO N=1,resParData%getNumResonances()
                call resParData%getResonanceInfo(resInfo, N)
                call resParData%getResonance(resonance, resInfo)
@@ -123,16 +117,7 @@ module mthe1_m
                      end if
                      IF (Iflr.GT.0) THEN
                         Napres = Napres + 1
-                        ! this should always be big enough as we
-                        ! sized it to number of varied parameters
-                        ! Exception: If gamma width data are combined
-                        ! we have more varied (but linked) resonance
-                        ! parameters than flagged
-                        call reallocate_integer_data(I_Inotu, Napres, Mmax2)
-                        I_Inotu(Napres) = Iflr
-                        if (combined.and.m.eq.2) then
-                            I_Inotu(Napres) = -1 * Iflr
-                        end if
+
                         Iuif = 0  ! assume it does contribute
 
                         ! if not solving bayes equation, it only contributes if pup'ed
@@ -184,8 +169,7 @@ module mthe1_m
                            END IF
                         END IF
                         if (Iuif.eq.1) then
-                           call covData%addToIrrelevant(Iflr)
-                           I_Inotu(Napres) = 0
+                           call covData%addToIrrelevant(Iflr)                        
                         else
                           if (covData%isPupedParameter(Iflr)) then
                              havePups = .true.
@@ -197,15 +181,6 @@ module mthe1_m
             END DO
          END IF
 
-         if (napres.gt.0) then
-            needResDerivs = .true.
-         end if
-
-         if( Ksolve.eq.2) then
-             needResDerivs = .false.
-             if (havePups) needResDerivs = .true.
-         end if
-
 !
       call gridAccess%destroy()
       RETURN
@@ -252,66 +227,6 @@ module mthe1_m
       END DO
       end subroutine UpdateExperimentalMatrix
 
-      subroutine getParamPerSpinGroup(ires, igr, npr, needDeriv,  &
-                                      Kstart, ifcap)
-      use EndfData_common_m, only : covData, resParData
-      use SammySpinGroupInfo_M
-      use SammyResonanceInfo_M
-      use templc_common_m, only : I_Inotu
-      use fixedi_m, only : needResDerivs
-      implicit none
-      integer,intent(inout)::ires  ! on input the last resonance in previous spin group.
-                                   ! on output the last resonance in this spin group
-      integer,intent(inout)::npr   ! number of flagged parameters in this spin group
-      integer,intent(in)::igr      ! spin group for which to get the number of varied parameters
-      integer,intent(in)::Kstart   ! the number of flagged paramters up to this spin group
-      logical,intent(out)::needDeriv   ! do any matter enough to need derivatives
-      logical,intent(out)::ifcap       ! are there any combined gamma width data that matter
-
-      type(SammySpinGroupInfo)::spinInfo
-      type(SammyResonanceInfo)::resInfo
-      integer::Iflr, M, Mmax2, i, start
-      logical::combined, includeGrp
-
-      call resParData%getSpinGroupInfo(spinInfo, igr)
-      Mmax2 = spinInfo%getNumResPar()
-      combined = spinInfo%getGammWidthParIndex().gt.0
-
-      Npr = 0
-      needDeriv = .false.
-      ifcap = .false.
-
-      includeGrp = spinInfo%getIncludeInCalc()
-      start = ires + 1
-      do i = start, resParData%getNumResonances()
-         call resParData%getResonanceInfo(resInfo, i)
-         if( resInfo%getSpinGroupIndex().ne.igr) exit
-         ires = i
-         if( .not.needResDerivs) cycle
-         if( .not.includeGrp) cycle
-         if( .not.resInfo%getIncludeInCalc()) cycle
-
-         DO M=1,Mmax2
-            if(m.eq.1) then
-               Iflr = resInfo%getEnergyFitOption()
-            else
-               Iflr = resInfo%getChannelFitOption(m-1)
-            end if
-            IF (Iflr.GT.0) THEN
-               Npr = Npr + 1
-               if(covData%contributes(Iflr)) then
-                  needDeriv =  .true.
-                  if (Iflr.ne.abs(I_Inotu(Npr + Kstart))) then
-                      STOP 'wrong number of varied getParamPerSpinGroup6'
-                  end if
-                  if (m.eq.2.and.combined) then
-                      ifcap = .true.
-                  end if
-               end if
-            END IF
-         END DO
-      end do
-      end subroutine getParamPerSpinGroup
 !
 !
 ! --------------------------------------------------------------
diff --git a/sammy/src/xct/XctCrossCalc_M.f90 b/sammy/src/xct/XctCrossCalc_M.f90
index c18f7aaab..8897a3acb 100644
--- a/sammy/src/xct/XctCrossCalc_M.f90
+++ b/sammy/src/xct/XctCrossCalc_M.f90
@@ -12,8 +12,10 @@ module XctCrossCalc_M
      ! do we need the cross sections for a given channel
      ! this is assuming first width is gamma and is not counted, and all other width are as in normal sammy definition
      logical,allocatable,dimension(:)::Ifcros(:)
+     logical::separateIso
 
       type(DerivativeHandler)::crossDataSelf     ! the self indicated cross section and derivative calculated for a given energy
+      logical,allocatable,dimension(:)::crossSelfWhy  ! reproduce a SAMMY bug for self-indication experiments. To Do fix the bug instead
 
       integer::lllmax = 0                  ! maximum number of Clebsch-Gordon coefficients
       integer::Kfinit = 0                  ! finite-size corrections flag
@@ -29,8 +31,8 @@ module XctCrossCalc_M
       integer::Kslow = 0     ! should we use the slow or fast version of Clebsch-Gordon calculation
       integer::C_G_Kxlmn = 1
 
-      integer::Ifdif = 0    ! Ifdif = 1 if need differential elastic, Ifdif = 2 if need differential reaction
       integer::Ifcoul = 0   ! do we need to calculate coulomb data
+      logical::addElimKapt  !ADD ELIMINATED CAPTURE CHANNEL TO FINA
 
       real(kind=8),allocatable,dimension(:,:)::Alj   ! used to count the number of Clebsch-Gordon coefficients
       real(kind=8),allocatable,dimension(:)::Xx      ! 0.0 or if SHIFT RESONANCE ENERGIES VIA SHIFT FACTOR, the factor
@@ -40,23 +42,55 @@ module XctCrossCalc_M
 
      real(kind=8),allocatable,dimension(:,:)::Br, Bi    ! energy independent part of derivatives for resonance parameters
      real(kind=8),allocatable,dimension(:,:,:)::Bga !E ENERGY-INDEPENDENT PORTION OF PARTIAL of R wrt reduced-width-amplitudes (for those which are not varied)
+     real(kind=8),allocatable,dimension(:,:,:)::Pgar, Pgai  ! ENERGY-INDEPENDENT PORTION OF PARTIAL of R wrt reduced-width-amplitudes (for those which are not varied)
 
      real(kind=8),allocatable,dimension(:)::Alphar  !  (DEL E) / ( (DEL E)**2 + (Gamgam/2)**2 )
      real(kind=8),allocatable,dimension(:)::Alphai  ! Gamgam/2 / ( (DEL E)**2 + (Gamgam/2)**2 )
      logical,allocatable,dimension(:)::needAlphai   ! is Alphai big enough that it needs to be calculated and added
      real(kind=8),allocatable,dimension(:)::Difen   ! resonance energy minus currrent energy or 0 if resonance is not included in calculation
-     real(kind=8),allocatable,dimension(:)::Difmax  ! if Difen for a given resonance is less than Difmax, we set  needAlphai true
+
 
      real(kind=8),allocatable,dimension(:,:)::Pi, Pr
 
-     ! note these are temporary also here so that we can
-     ! refactor without dependencies on array_sizes_common
-     real(kind=8),allocatable,dimension(:)::A_Isigxx, A_Idasig, A_Idbsig
-     real(kind=8),allocatable,dimension(:)::A_Isigsi, A_Idasis, A_Idbsis
+     real(kind=8),allocatable,dimension(:,:)::Cscs
+     real(kind=8),allocatable,dimension(:)::Sinsqr  ! sin^2( phase shift )
+     real(kind=8),allocatable,dimension(:)::Sin2ph  ! sin( 2 * phase shift )
+     real(kind=8),allocatable,dimension(:)::Dphi
+     real(kind=8),allocatable,dimension(:)::Sinphi, Cosphi
+     real(kind=8),allocatable,dimension(:)::Dpdr ! partial P wrt Rho
+     real(kind=8),allocatable,dimension(:)::Dsdr ! partial S wrt Rho
+
+     real(kind=8),allocatable,dimension(:,:)::Rmat, Ymat, Yinv
+     real(kind=8),allocatable,dimension(:)::Rootp
+     real(kind=8),allocatable,dimension(:)::Elinvr,Elinvi
+     real(kind=8),allocatable,dimension(:)::Psmall
+     real(kind=8),allocatable,dimension(:)::Xxxxr, Xxxxi
+     real(kind=8),allocatable,dimension(:,:)::Xqr,Xqi
+     real(kind=8),allocatable,dimension(:,:)::Pxrhor, Pxrhoi
+     real(kind=8),allocatable,dimension(:,:)::Qr, Qi
+     real(kind=8),allocatable,dimension(:,:)::Tr, Ti
+     real(kind=8),allocatable,dimension(:,:,:)::Tx
+     real(kind=8),allocatable,dimension(:)::Ddddd, Ddddtl
+     logical,allocatable, dimension(:,:)::useChannel
+     real(kind=8),allocatable,dimension(:,:)::Prei, Prer
+     real(kind=8),allocatable,dimension(:)::Dsf
+     real(kind=8),allocatable,dimension(:,:,:)::Dsfx, Dstx
+     real(kind=8),allocatable,dimension(:,:)::Dstt, Dst
+     real(kind=8),allocatable,dimension(:)::Xden
+
+     real(kind=8),allocatable,dimension(:)::termf, termfx
+
+     real(kind=8),allocatable,dimension(:,:,:)::crossInternal           ! used to keep track of cross section+deriv for one row and all channels
+     real(kind=8),allocatable,dimension(:,:,:,:,:)::angInternal         ! used to keep track of angula section+deriv for one row and all channels
+     real(kind=8),allocatable,dimension(:)::uniqueEchan  ! the unique value of echan for a given isotope, used as a scratch array during calculation
+     integer,allocatable,dimension(:)::iradIndex  ! map radius id
+
+     real(kind=8),allocatable,dimension(:,:)::Ccoulx
      contains
      procedure, pass(this) :: setUpDerivativeList => XctCrossCalc_setUpDerivativeList    ! set up  crossData, depending on number of isotopes
      procedure, pass(this) :: setAddtionalParams => XctCrossCalc_setAddtionalParams
      procedure, pass(this) :: setEnergyIndependent => XctCrossCalc_setEnergyIndependent  ! set energy independent values using current parameter values
+     procedure, pass(this) :: getParamPerSpinGroup => XctCrossCalc_getParamPerSpinGroup  ! also fill useChannel
      procedure, pass(this) :: calcCross => XctCrossCalc_calcCross
      procedure, pass(this) :: initialize => XctCrossCalc_initialize
      procedure, pass(this) :: destroy => XctCrossCalc_destroy
@@ -89,6 +123,7 @@ subroutine XctCrossCalc_setAddtionalParams(this,  lllmax, Kfinit, wantSelfIndica
      end if
 
      this%Kfinit  = Kfinit
+     if (Kfinit.ne.0) this%Ifcros = .true. ! need all cross sections
      this%lllmax = lllmax
      this%Kssmsc = Kssmsc
 
@@ -131,13 +166,23 @@ subroutine XctCrossCalc_setEnergyIndependent(this, reactType, Twomhb, kwcoul, Et
 
     call CrossSectionCalculator_setEnergyIndependent(this, reactType, Twomhb, kwcoul, Etac)
 
+    ! set bounds
+    call this%setBound(Twomhb, kwcoul, Etac)
+
     ! calculate energy shift if needed
     if (this%doResShift) then
          call Fixx (this, this%XX,  this%XxHelper)
     end if
 
     ! determine whether we need coulomb interaction
-    call Find_If_Coulomb (this, this%IfCoul, this%Ifdif)
+    call Find_If_Coulomb (this, this%IfCoul)
+
+    if (this%Ifcoul.gt.0) then
+        if (.not.allocated(this%Ccoulx)) then
+           allocate(this%Ccoulx(this%ntotc, this%resData%getNumSpinGroups()))
+        end if
+        call Start_Coul (this%Zke, this%Ccoulx, this%resData)
+    end if
 end subroutine
 subroutine XctCrossCalc_calcCross(this, ener, Ipoten)
     class(XctCrossCalc):: this
@@ -160,27 +205,85 @@ subroutine XctCrossCalc_setUpDerivativeList(this)
 
    call CrossSectionCalculator_setUpDerivativeList(this)
 
-
-   ! initially set all shared isotope IDs to 1  
-   numIso = this%crossData%getNumberIsotopes()
-   if (numIso.gt.1) then
-      itot = this%covariance%getNumTotalParam() + 1
-      do i = 1, itot
-          ii = this%crossData%getIsotopeForShared(i)
-          if (ii.gt.0) then
-              call this%crossData%addSharedColumn(i, 1)
-              if (this%wantSelfIndicate) then
-                 call this%crossDataSelf%addSharedColumn(i, 1)
-              end if
-          end if
-      end do
-    end if   
-
     if (this%wantSelfIndicate) then
         call this%crossDataSelf%nullify()
         call this%crossDataSelf%setNnsig(1)
     end if
 end subroutine
+subroutine XctCrossCalc_getParamPerSpinGroup(this, ires, igr,  fillIt)
+    class(XctCrossCalc) :: this
+    integer,intent(inout)::ires  ! starting resonance for this group
+    integer,intent(in)::igr     ! spin group for which to get the number of varied parameters
+    logical,intent(in)::fillIt
+
+    type(SammySpinGroupInfo):: spinInfo
+    type(SammyChannelInfo)::channelInfo
+    integer::Ichan
+    integer::k, nent
+    logical::inc, fillLocal
+    optional fillIt
+
+    fillLocal = .true.
+    if (present(fillIt)) fillLocal = fillIt
+    call CrossSectionCalculator_getParamPerSpinGroup(this, ires, igr,  fillLocal)
+    if (.not.fillLocal) return ! for getting the number of parameters, not for filling data
+
+    this%useChannel(:,1) = .false.
+    call this%resData%getSpinGroupInfo(spinInfo, igr)
+    nent = spinInfo%getNumEntryChannels()
+
+    ! 1-d data
+    do ichan = 1, this%ntotc + 1
+       if (.not.this%Ifcros(ichan)) cycle
+
+       if (ichan.le.2) then
+          this%useChannel(ichan, 1) = .true.
+          cycle
+        end if
+
+        k = Ichan-2+Nent
+        inc = .true.
+        if (k.le.spinInfo%getNumChannels()) then
+           call spinInfo%getChannelInfo(channelInfo, k)
+           inc =  channelInfo%getIncludeInCalc()
+        end if
+        if (inc) then
+           if (.not.this%addElimKapt) then
+               this%useChannel(ichan, 1) = .true.
+           end if
+        else
+           if (this%addElimKapt) then
+              this%useChannel(ichan, 1) = .true.
+           end if
+        end if
+    end do
+
+    ! 2-d data
+    if (.not.this%needAngular) return
+    this%useChannel(:,2) = .true.
+    do ichan = 1, this%ntotc + 1
+        IF (this%reactType.ne.11) then  ! elastic
+            if(Ichan.GT.Nent) this%useChannel(ichan, 2)  = .false. ! but not an elastic channel
+       ELSE   !  reaction of some kind
+          inc = .true.
+          if (ichan.le.spinInfo%getNumChannels()) then
+             call spinInfo%getChannelInfo(channelInfo, ichan)
+             inc =  channelInfo%getIncludeInCalc()
+             if (channelInfo%getExcludeCompletely()) then
+                this%useChannel(ichan, 2) = .false. ! Do not want it anywhere
+                cycle
+             end if
+          end if
+          IF (Ichan.LE.Nent) THEN
+              this%useChannel(ichan, 2) = .false.  ! Do not want elastic
+          else if (channelInfo%getIncludeInCalc()) then
+              if ( this%addElimKapt) this%useChannel(ichan, 2) = .false. !  Will subtract only excluded channels from absorption
+          else  ! normally excclude but calc%addElimKapt.eq.true overrides exclusion
+               IF (.not.this%addElimKapt)  this%useChannel(ichan, 2) = .false. !  Do not want excluded channel in final state
+          END IF
+       END IF
+    end do
+end subroutine
 subroutine XctCrossCalc_initialize(this, pars, cov, rad, niso, needAngular, Itzero, Ilzero, doShiftRes)
     class(XctCrossCalc) :: this
     type(SammyRMatrixParameters)::pars
@@ -191,10 +294,14 @@ subroutine XctCrossCalc_initialize(this, pars, cov, rad, niso, needAngular, Itze
     integer::ntot
     logical,intent(in)::needAngular, doShiftRes
 
-    integer::itot,  ipup, irad, nres
+    integer::itot,  ipup, irad, nres, ngroup, igr, ichan, ifl
     logical(C_BOOL)::countCombined
+    type(SammySpinGroupInfo)::spinInfo
 
     call CrossSectionCalculator_initialize(this, pars, cov, rad, niso, needAngular, Itzero, Ilzero, doShiftRes)
+    this%separateIso = .true.
+    this%addElimKapt = .false.
+    if (niso.eq.1) this%separateIso = .false.
     call info%initialize(pars, cov, rad)
 
      ntot = info%getMaxChannel()
@@ -202,18 +309,38 @@ subroutine XctCrossCalc_initialize(this, pars, cov, rad, niso, needAngular, Itze
      allocate(this%Ifcros(ntot))
      this%Ifcros = .true.  ! assume cross sections are to be calculated for all channels
 
+    call allocate_real_data(this%termf, max(2,ntot))
+    call allocate_real_data(this%termfx, max(2,ntot))
+
     this%ntotc = info%getMaxChannel() -1  ! for most of the internal arrays the gamma channel is not used in the internal arrays
     this%ntriag = (this%ntotc*(this%ntotc+1))/2
     countCombined = .true.
     call info%getNumAll(itot, ipup, countCombined)
+    if(this%Itzero.gt.0 .or. this%Ilzero.gt.0) itot = itot + 2
     irad = this%radiusData%getNumTotalVaried()
     nres = this%resData%getNumResonances()
+    ngroup = this%resData%getNumSpinGroups()
     call info%destroy()
 
     call allocate_real_data(this%Alphai, nres)
     call allocate_real_data(this%Alphar, nres)
     allocate(this%needAlphai(nres))
     call allocate_real_data(this%Difen, nres)
+    call allocate_real_data(this%Xden, nres)
+
+    if (this%Itzero.gt.0 .or. this%Ilzero.gt.0) then
+       call reallocate_real_data_2d(this%Prer, this%ntriag, 0, ngroup, 0)
+       call reallocate_real_data_2d(this%Prei, this%ntriag, 0, ngroup, 0)
+    end if
+    if (this%Itzero.gt.0 .or. this%Ilzero.gt.0.or.irad.gt.0) then
+        allocate(this%Dstt(this%ntotc, this%ntotc))
+        allocate(this%Dst(2, this%ntotc))
+        call allocate_real_data(this%Dsf, this%ntotc+1) ! for all reacttions
+        if (this%needAngular) then
+           allocate(this%Dsfx(2, this%ntotc, this%ntotc))
+           allocate(this%Dstx(2, this%ntotc, this%ntotc))
+        end if
+    end if
 
     if (doShiftRes) then
        call allocate_real_data(this%Xx, pars%getNumResonances())
@@ -225,17 +352,100 @@ subroutine XctCrossCalc_initialize(this, pars, cov, rad, niso, needAngular, Itze
        call reallocate_real_data_2d(this%Bi, this%ntriag, 0, itot, 0)
        call reallocate_real_data_2d(this%Pr, this%ntriag, 0, itot, 0)
        call reallocate_real_data_2d(this%Pi, this%ntriag, 0, itot, 0)
+       call reallocate_real_data_2d(this%Qr, this%ntriag, 0, this%ntriag, 0)
+       call reallocate_real_data_2d(this%Qi, this%ntriag, 0, this%ntriag, 0)
+       call reallocate_real_data_2d(this%Tr, this%ntotc+1, 0, this%ntriag, 0)
+       call reallocate_real_data_2d(this%Ti, this%ntotc+1, 0, this%ntriag, 0)
+       call allocate_real_data(this%Ddddd, this%ntotc+1)  ! derivative calculated for all entry channels
+       call allocate_real_data(this%Ddddtl, this%ntotc+1)
+       if (this%needAngular) then
+          allocate(this%Tx(2, this%ntriag, this%ntriag))
+       end if
+    end if
+    allocate(this%useChannel(this%ntotc+1,2))
+    allocate(this%crossSelfWhy(this%covariance%getNumTotalParam()+1))
+
+
+    call reallocate_real_data_2d(this%Rmat, 2, 0, this%ntriag, 0)
+    call reallocate_real_data_2d(this%Ymat, 2, 0, this%ntriag, 0)
+    call reallocate_real_data_2d(this%Yinv, 2, 0, this%ntriag, 0)
+
+     call allocate_real_data(this%Xxxxr, this%ntriag)
+     call allocate_real_data(this%Xxxxi, this%ntriag)
+     call reallocate_real_data_2d(this%Xqr, this%ntotc, 0, this%ntotc, 0)
+     call reallocate_real_data_2d(this%Xqi, this%ntotc, 0, this%ntotc, 0)
+
+
+     call reallocate_real_data_2d(this%Bound, this%ntotc, 0, ngroup, 0)
+
+     if (this%needAngular) then
+        call reallocate_real_data_2d(this%Cscs, 2, 0, this%ntriag, 0)
+      end if
+
+     call allocate_real_data(this%Sinsqr, this%ntotc)
+     call allocate_real_data(this%Sin2ph, this%ntotc)
+     call allocate_real_data(this%Dphi, this%ntotc)
+     call allocate_real_data(this%Sinphi, this%ntotc)
+     call allocate_real_data(this%Cosphi, this%ntotc)
+     call allocate_real_data(this%Rootp, this%ntotc)
+     call allocate_real_data(this%Elinvr, this%ntotc)
+     call allocate_real_data(this%Elinvi, this%ntotc)
+     call allocate_real_data(this%Psmall, this%ntotc)
+
+
+    if (this%Itzero.ne.0 .or. this%Ilzero.ne.0 .OR. irad.gt.0) then
+       call allocate_real_data(this%Dpdr, this%ntotc)
+       call allocate_real_data(this%Dsdr, this%ntotc)
+       call reallocate_real_data_2d(this%Pxrhor, this%ntriag, 0, this%ntotc, 0)
+       call reallocate_real_data_2d(this%Pxrhoi, this%ntriag, 0, this%ntotc, 0)
     end if
 
     if (irad.gt.0) then
        if( nres.gt.0) allocate(this%Bga(this%ntriag, this%ntotc, nres))
+
+       ! collect the unique fit flags for the true radius
+       ! in iradIndex
+       allocate(this%iradIndex(irad))
+       this%iradIndex = 0
+       irad = 0
+       do igr = 1, ngroup
+          call this%resData%getSpinGroupInfo(spinInfo,igr)
+          DO ichan=1, spinInfo%getNumChannels()
+             ifl = this%radiusData%getTrueFitFlag(Igr, Ichan)
+             if (ifl.eq.0) cycle
+             ! check whether we need to add it
+             if (.not.any(this%iradIndex.eq.ifl)) then
+                irad = irad + 1
+                this%iradIndex(irad) = ifl
+             end if
+          end do
+       end do
+       ! the new irad might be smaller than the first irad in case some of the true radii are linked
+       if (irad.ne.0) then ! none of the true radii is fitted
+          allocate(this%Pgar(this%ntriag, irad, ngroup))
+          allocate(this%Pgai(this%ntriag, irad, ngroup))
+       end if
     end if
+
+    allocate(this%crossInternal(ntot, this%resData%getNumSpinGroups(), 0:this%covariance%getNumTotalParam()))
+
+    if (this%needAngular) then
+       allocate(this%angInternal(2, ntot, ntot, this%resData%getNumSpinGroups(), 0:this%covariance%getNumTotalParam()))
+       allocate(this%uniqueEchan(this%numIso))
+    end if
+
 end subroutine
 subroutine XctCrossCalc_destroy(this)
     class(XctCrossCalc) :: this
 
     call CrossSectionCalculator_destroy(this)
     deallocate(this%Ifcros)
+    deallocate(this%termf)
+    deallocate(this%termfx)
+    deallocate(this%crossInternal)
+    if (allocated(this%angInternal)) deallocate(this%angInternal)
+    if (allocated(this%uniqueEchan)) deallocate(this%uniqueEchan)
+    deallocate(this%Bound)
 
     if (allocated(this%Alj))      deallocate(this%Alj)
     if (allocated(this%Xx))       deallocate(this%Xx)
@@ -247,10 +457,54 @@ subroutine XctCrossCalc_destroy(this)
     if (allocated(this%Pr))       deallocate(this%Pr)
     if (allocated(this%Pi))       deallocate(this%Pi)
     if (allocated(this%Bga))      deallocate(this%Bga)
+    if(allocated(this%Pgar))      deallocate(this%Pgar)
+    if(allocated(this%Pgai))      deallocate(this%Pgai)
     if (allocated(this%Alphai))   deallocate(this%Alphai)
     if (allocated(this%Alphar))   deallocate(this%Alphar)
     if (allocated(this%needAlphai))     deallocate(this%needAlphai)
     if (allocated(this%Difen))    deallocate(this%Difen)
+    if (allocated(this%iradIndex)) deallocate(this%iradIndex)
+    if (allocated(this%Cscs)) deallocate(this%Cscs)
+    deallocate(this%Sinsqr)
+    deallocate(this%Sin2ph)
+    deallocate(this%Dphi)
+    deallocate(this%Sinphi)
+    deallocate(this%Cosphi)
+    if (allocated(this%Dpdr)) deallocate(this%Dpdr)
+    if (allocated(this%Dsdr)) deallocate(this%Dsdr)
+    if( allocated(this%Ddddd)) deallocate(this%Ddddd)
+    if( allocated(this%Ddddtl)) deallocate(this%Ddddtl)
+    if( allocated(this%useChannel)) deallocate(this%useChannel)
+    if(allocated(this%Prer)) deallocate(this%Prer)
+    if(allocated(this%Prei)) deallocate(this%Prei)
+    if (allocated(this%Dsf)) deallocate(this%Dsf)
+    if (allocated(this%Dsfx)) deallocate(this%Dsfx)
+    if (allocated(this%Dsf)) deallocate(this%Dsf)
+    if (allocated(this%Dstx)) deallocate(this%Dstx)
+    if (allocated(this%Dstt)) deallocate(this%Dstt)
+     if (allocated(this%Dst)) deallocate(this%Dst)
+    deallocate(this%Rmat)
+    deallocate(this%Ymat)
+    deallocate(this%Yinv)
+    deallocate(this%Rootp)
+    deallocate(this%Elinvr)
+    deallocate(this%Elinvi)
+    deallocate(this%Psmall)
+    deallocate(this%Xxxxr)
+    deallocate(this%Xxxxi)
+    deallocate(this%Xqr)
+    deallocate(this%Xqi)
+    deallocate(this%Xden)
+    if(allocated(this%Qr))deallocate(this%Qr)
+    if(allocated(this%Qi)) deallocate(this%Qi)
+    if(allocated(this%Tr)) deallocate(this%Tr)
+    if(allocated(this%Ti)) deallocate(this%Ti)
+    if(allocated(this%Tx)) deallocate(this%Tx)
+    if(allocated(this%Pxrhor)) deallocate(this%Pxrhor)
+    if(allocated(this%Pxrhoi)) deallocate(this%Pxrhoi)
+    if(allocated(this%Ccoulx)) deallocate(this%Ccoulx)
+
+    if (allocated(this%crossSelfWhy)) deallocate(this%crossSelfWhy)
 end subroutine
 
 end module XctCrossCalc_M
diff --git a/sammy/src/xct/mxct0.f90 b/sammy/src/xct/mxct0.f90
index c116e4e16..cca0ec9a4 100644
--- a/sammy/src/xct/mxct0.f90
+++ b/sammy/src/xct/mxct0.f90
@@ -33,9 +33,9 @@ module xct_m
       character(len=80)::line
       integer::iflagMatch
       integer::Idimen
-      integer::K_Coul_N, Kslow, Lllmmm, Mxany, N, Neight, Nfive1, Nfive1x, Nfive2, Nfive3, Nfive3x, Nfive4, Nfour
-      integer::Ifinal, Krext, Nfour1, Nfour2, Ng, Nnine, Nsix, Nthr1, Nthr2, Nthr3, ntwo1, numElAux, Nw1
-      integer::Nnndrc
+      integer::K_Coul_N, Lllmmm, Mxany, N, Neight, Nfive1, Nfive1x, Nfive2, Nfive3, Nfive3x, Nfive4, Nfour
+      integer::Ifinal, Krext, Nfour1, Nfour2, Ng, Nnine, Nsix, Nthr1, Nthr2, Nthr3, ntwo1, numElAux, Nw1, NcrssxO
+      integer::Nnndrc, Nfprrr
       class(XctCrossCalc)::xct   ! temporarily here so that energy indepdent code can move in steps
       external Idimen
 !
@@ -47,6 +47,8 @@ module xct_m
       Segmen(2) = 'C'
       Segmen(3) = 'T'
       Nowwww = 0
+      NcrssxO = 0
+      if (any(xct%Ifcros)) NcrssxO = 1
 
       call grid%initialize()
       call grid%setParameters(numcro, ktzero)
@@ -87,7 +89,6 @@ module xct_m
 !
 ! *** Count how many non-zero elements are in Xlmn
       Kkxlmn = xct%C_G_Kxlmn
-      Kslow = xct%Kslow
 !
       IF (Kadddc.NE.0) THEN
 ! ***    Scan direct-capture file, figure dimensions et al
@@ -98,15 +99,12 @@ module xct_m
 !
 ! *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMMY-XCT
       Ifcoul = xct%IfCoul
-      CALL Estxct (Ntwo1, Nthr1, Nthr2, Nthr3, Nfour, Nfour1, Nfour2, &
+      CALL Estxct (xct, Ntwo1, Nthr1, Nthr2, Nthr3, Nfour, Nfour1, Nfour2, &
          Nfive1, Nfive2, Nfive3, Nfive4, Nfive1x, Nfive3x, Nsix, Neight, &
-         Nnine, Nw1, Mxany, Nfprrr, K_Coul_N, numElAux)
+         Nnine, Nw1, Mxany, Nfprrr, K_Coul_N, numElAux, NcrssxO)
 !
 ! *** Zero ***
       N = Ndasig
-      IF (N.ne.0) THEN
-         call make_I_Iisopa(N)
-      END IF
 !
       IF (Ifcoul.NE.0) THEN
          call make_A_Iccoul(K_Coul_N)
@@ -143,31 +141,9 @@ module xct_m
 ! - - - - - - - - - - - - - - - - <      
 ! - - - - - - - - - - - - - - - - >
 !
-!
-! *** Generate coefficients of Legendre polynomials for the various spin
-! ***    group pairs, if differential cross sections are needed (if 
-! ***    Kcros=7 .OR. Kcros=11 .OR. Kssmsc>0)
-! *** three ***
-      call allocate_real_data(A_Icccll, Nthr1)
-      call allocate_real_data(A_Idddll, Nthr2)
-!
 ! *** four ***
-      N = Nfour
-!                     Nfour = (Ntriag) * (Nfpres)
-      N   = Nfour1
-      N   = Nfour2
-      call allocate_real_data(A_Ipgar, N)
-      call allocate_real_data(A_Ipgai, N)
-!
-
 !
 ! *** five ***
-      call allocate_real_data(A_Icrss, Nfive1)
-      call allocate_real_data(A_Ideriv, Nfive2)
-      call allocate_real_data(A_Icrssx, Nfive3)
-      call allocate_real_data(A_Idervx, Nfive4)
-      call allocate_real_data(A_Icrsnd, Nfive1x)
-      call allocate_real_data(A_Icrxnd, Nfive3x)
 !
       IF (Kadddc.EQ.1) THEN
          call allocate_real_data(A_Iedrcp, Nucdrc*Numdrc)
@@ -183,50 +159,19 @@ module xct_m
 ! - - - - - - - - - - - - - - - - - - - - - - <
 ! *** six ***
 !                                Nsix = Nfpres
-      IF (IfCoul.GT.0) THEN
-         ng = resParData%getNumSpinGroups()
-         call allocate_real_data(A_Icx, Ntotc*Ng)
-      END IF
 ! - - - - - - - - - - - - - - - - <
-! *** seven ***
-      call allocate_real_data(A_Ixden, Mres)
 ! CALL Abpart, Abpga
 ! - - - - - - - - - - - - - - - - >
 ! *** eight ***
 !
 ! *** nine ***
-      N = Ntotc
-      call allocate_real_data(A_Isinsq, N)
-      call allocate_real_data(A_Isinph, N)
-      call allocate_real_data(A_Idphi, N)
-      call allocate_real_data(A_Idpdr, N)
-      call allocate_real_data(A_Idsdr, N)   
       IF (Ifdif.NE.0.and.2*Ntriag.gt.N) then
          N = 2*Ntriag
       ENd if
-      call allocate_real_data(A_Icscs, N)
       N  = Ntotc
-      call allocate_real_data(A_Icc, N)
-      call allocate_real_data(A_Iss, N)
 ! CALL Sinsix
-!
-! *** ten ***
-      N = Ntotc
-      call allocate_real_data(A_Irootp, N)
-      call allocate_real_data(A_Linvr, N)
-      call allocate_real_data(A_Linvi, N)
-      call allocate_real_data(A_Ipsmal, N)
-      N = Ntriag
-      call allocate_real_data(A_Ixxxxr, N)
-      call allocate_real_data(A_Ixxxxi, N)
-      N = Ntotc*Ntotc
-      call allocate_real_data(A_Ixqr, N)
-      call allocate_real_data(A_Ixqi, N)
-      call allocate_real_data(A_Iyinv, 2*Ntriag)
 ! - - - - - - - - - - - - - - - - <
 ! *** eleven ***
-      call allocate_real_data(A_Irmat, 2*Ntriag)
-      call allocate_real_data(A_Iymat, 2*Ntriag)
 ! CALL Setr
 ! CALL Yinvrs
 ! CALL Setxqx
@@ -235,40 +180,15 @@ module xct_m
 ! *** twelve ***
       N = (Ncrsss-2)
       IF (N.EQ.0) N = 1
-      IF (Ncrssx.EQ.0) N = 1
+      IF (NcrssxO.EQ.0) N = 1
       if (n.lt.ntotc) n = ntotc
-      call allocate_real_data(A_Itermf, N)
-      call allocate_real_data(A_Iterfx, N)
 ! CALL Sectio
-!
-      N = Ntriag*Ntriag
-      call allocate_real_data(A_Iqr, N)
-      call allocate_real_data(A_Iqi, N)
 ! CALL Setqri
-!
-      N = Ncrsss*Ntriag
-      IF (Ncrssx.EQ.0) N = 1
-      call allocate_real_data(A_Itr, N)
-      call allocate_real_data(A_Iti, N)
-      N = 2*Ntriag**2
-      call allocate_real_data(A_Itx, N)
 ! CALL Settri
-      call allocate_real_data(A_Iddddd, Ncrsss)
 ! CALL Derres
 ! CALL Dercap
-      call allocate_real_data(A_Iddtlz, Ncrsss)
 ! CALL Dereee
 ! CALL Derext
-      ng = resParData%getNumSpinGroups()
-      call allocate_real_data(A_Ipxrr, Ntriag*Ntotc)
-      call allocate_real_data(A_Ipxri, Ntriag*Ntotc)
-      call allocate_real_data(A_Idsf, Ntotc)
-      call allocate_real_data(A_Idst, Ntotc*2)
-      call allocate_real_data(A_Idstt, Ntotc*2*Ntotc)
-      call allocate_real_data(A_Idsfx, 2*Ntotc*Ntotc)
-      call allocate_real_data(A_Idstx, 2*Ntotc*Ntotc)
-      call allocate_real_data(A_Iprer, Ntriag*Ng)
-      call allocate_real_data(A_Iprei, Ntriag*Ng)
 ! CALL Setpxr
 ! CALL Derrho
 ! CALL Derrad
@@ -282,10 +202,8 @@ module xct_m
       Lllmmm = Lllmax
       IF (Lllmax.EQ.0) Lllmmm = 1
       CALL Work (    xct, calcData , calcDataSelf,               &
-          A_Isigxx , A_Idasig , A_Idbsig , A_Isigsi , A_Idasis , &
-          A_Idbsis , I_Iisopa ,                                  &
           A_Iedrcp , A_Icdrcp ,                                  &
-          A_Ixdrcp , I_Indrcp , Nnndrc   , Lllmmm   , Kslow)
+          A_Ixdrcp , I_Indrcp , Nnndrc   , Lllmmm)
 ! *** SBROUTINE Work generates theory and derivatives
 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
 !
@@ -311,25 +229,26 @@ module xct_m
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Estxct (Ntwo1, Nthr1, Nthr2, Nthr3, Nfour, Nfour1, &
+      SUBROUTINE Estxct (xct, Ntwo1, Nthr1, Nthr2, Nthr3, Nfour, Nfour1, &
          Nfour2, Nfive1, Nfive2, Nfive3, Nfive4, Nfive1x, Nfive3x, &
          Nsix, Neight, Nnine, Nw1, Mxany, Nfprrr, K_Coul_N, &
-         numElAux)
+         numElAux, Ncrssx)
 !
 ! *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMMY-XCT
 !
-      use fixedi_m, only : Ifdif, Iq_Iso, Iq_Val, Kkxlmn, Lllmax, Nres, Mres, Ncrssx, Ncrsss,  &
+      use fixedi_m, only : Ifdif, Iq_Iso, Iq_Val, Kkxlmn, Lllmax, Nres, Mres, Ncrsss,  &
                            Ndasig, Ndbsig, Nfpres, Nnniso, Npfil3, Nrfil3, Ntotc, Ntriag,      &
-                           Kshift, needResDerivs
+                           Kshift
       use ifwrit_m, only : Ifcoul, Kcros, Kpiece, Ksolve, Kssmsc, Nd_Xct,Nnpar
-      !use lbro_common_m
+      use XctCrossCalc_M
       use EndfData_common_m, only : resParData, radFitFlags
       use rsl7_m, only : Figure_Kws_Xct
       IMPLICIT none
+      class(XctCrossCalc)::xct   ! temporarily here so that energy indepdent code can move in steps
       integer::Ntwo1, Nthr1, Nthr2, Nthr3, Nfour, Nfour1, &
                Nfour2, Nfive1, Nfive2, Nfive3, Nfive4, Nfive1x, Nfive3x, &
                Nsix, Neight, Nnine, Nw1, Mxany, Nfprrr, K_Coul_N, &
-               numElAux
+               numElAux, Ncrssx
        integer::Idimen
        integer::I,K, K1, K2, K3,K4, K6, K7, K8, Ke, Kw, low, N,Nthr4
        external Idimen
@@ -369,7 +288,7 @@ module xct_m
 !
 ! *** four
       Nfour = 1
-      IF (needResDerivs) Nfour = Ntriag*Nfpres
+      IF (xct%wantDerivs) Nfour = Ntriag*Nfpres
       Nfour1 = Ntriag*Ntotc*resParData%getNumResonances()
       IF (Nfour1.EQ.0) Nfour1 = 1
       Nfprrr = radFitFlags%getNumTotalVaried()
@@ -391,7 +310,7 @@ module xct_m
          Nfive3 = 1
          IfCoul = 0
       ELSE
-         Nfive3 = 2*Ntotc*Ntotc*resParData%getNumSpinGroups()
+         Nfive3 = 2*Ntotc*Ntotc*resParData%getNumSpinGroups()         
       END IF
       Nfive4 = Nfive3*Nnpar
       IF (Nfive1.EQ.0) Nfive1 = 1
@@ -408,7 +327,7 @@ module xct_m
 !
 ! *** six
       nsix = 0
-      IF (needResDerivs) Nsix = Nfpres
+      IF (xct%wantDerivs) Nsix = Nfpres
       IF (Nsix.EQ.0) Nsix = 1
       K6 = 3*Mres + Nsix
 !
diff --git a/sammy/src/xct/mxct02.f90 b/sammy/src/xct/mxct02.f90
index 8d94997bb..d40f1bff6 100644
--- a/sammy/src/xct/mxct02.f90
+++ b/sammy/src/xct/mxct02.f90
@@ -5,9 +5,7 @@ module xct2_m
 ! --------------------------------------------------------------
 !
       SUBROUTINE Work (calc, derivs,   derivsSelf,                &
-         Sigxxx, Dasigx, Dbsigx, Sigsin, Dasigs,                  &
-         Dbsigs, Isopar,                                          &
-         Edrcpt, Cdrcpt, Xdrcpt, Ndrcpt, Nnndrc, Lllmmm, Kslow)
+         Edrcpt, Cdrcpt, Xdrcpt, Ndrcpt, Nnndrc, Lllmmm)
 !
 ! *** PURPOSE -- Generate theoretical cross sections "theory" and partial
 ! ***            Derivatives "dasig"
@@ -23,7 +21,6 @@ module xct2_m
       use cbro_common_m
       use lbro_common_m
       use EndfData_common_m
-      use ifsubs_common
       use SammyGridAccess_M
       use DerivativeHandler_M
       use xct3_m
@@ -34,35 +31,30 @@ module xct2_m
       use mxct26_m
       use mxct06_m
       use mxct18_m
+      use Zgauss_m
       use XctCrossCalc_M
       IMPLICIT none
 
-      real(8), intent(in)::                       &
-         Dasigx, Dbsigx, Sigsin, Dasigs,          &
-         Dbsigs
-      real(8), intent(out):: Sigxxx, Edrcpt, Cdrcpt, Xdrcpt
+      real(8), intent(out):: Edrcpt, Cdrcpt, Xdrcpt
 
-      integer(4), intent(in):: Isopar,Nnndrc, Lllmmm, Kslow
+      integer(4), intent(in):: Nnndrc, Lllmmm
       integer(4), intent(out):: Ndrcpt
       real(8):: Zero, A, Gbx, Theoryx
       integer(4):: Jdat, Idrcp, Ipoten, Iw, irow, istart, &
-                   Kount_Helmut, ng, numEl, TotalNdasig
+                   ng, numEl, TotalNdasig
       integer(4) :: Iipar, iso, Jcount, Jsig,isoReal
       real(8) :: val
 
       LOGICAL Ywhich
       type(SammyGridAccess)::grid
       type(DerivativeHandler)::derivs, derivsSelf
-      integer::iflagMatch
+      integer::iflagMatch, isoOur, is
       logical::wantNegative, wantDeriv
       class(XctCrossCalc)::calc
+      logical(C_BOOL)::accu
 
       DIMENSION   &
          Edrcpt(Nnndrc,*), Cdrcpt(Nnndrc,*), Xdrcpt(*), Ndrcpt(*)
-      
-      DIMENSION                                                       &
-         Sigxxx(Nnnsig,*), Dasigx(Nnnsig,*), Dbsigx(Nnnsig,Ndbxxx,*), &
-         Sigsin(*), Dasigs(*), Dbsigs(Ndbxxx,*), Isopar(*)
 !
 !      DIMENSION W...(...Ndatb)
 !
@@ -80,7 +72,13 @@ module xct2_m
       wantNegative = .true.
       if (Kkkdop.eq.1) wantNegative = .false.
 
-
+      accu = .true.
+      call derivs%setAccumulate(accu)
+      call derivsSelf%setAccumulate(accu)
+      calc%crossSelfWhy  = .false.
+      do is = Ndasig + 1, Ndbsig
+         calc%crossSelfWhy(is) = .true.  ! these should be parameter that are not shared
+      end do
 
       Ywhich = Ydoppr.OR.Yresol.OR.Yangle.OR.Yssmsc.OR.Yaverg.OR. Maxwel.EQ.1 .OR. Knocor.EQ.1
 
@@ -88,15 +86,22 @@ module xct2_m
       if ( covData%getPupedParam().gt.0) wantDeriv = .true.
 
 !
-      Kount_Helmut = 0
       Iw = 0
       IF (Ksindi.GT.0 .AND. Kcros.EQ.8) THEN
          Iw = 1
       END IF
       call derivs%nullify()
       call derivs%setNnsig(Nnnsig)
+      if (calc%reactType.eq.6) then
+          if( Nnnsig.ne.1) then
+              write(6,*)" Expected Nnsig to be 1 if calculating eta"
+              write(21,*)" Expected Nnsig to be 1 if calculating eta"
+              stop
+          end if
+          call calc%crossData%setNnsig(2)
+      end if
 
-      call derivs%reserve(numEl * Nnnsig, Ndasig + Ndbsig + 1)
+      call derivs%reserve(numEl * calc%crossData%getNnnsig(), Ndasig + Ndbsig + 1)
 
       IF (Iw.EQ.1.or.Ksitmp.gt.0) THEN
          call derivsSelf%nullify()
@@ -104,18 +109,12 @@ module xct2_m
          call derivsSelf%reserve(numEl, Ndasig + Ndbsig + 1)
       end if
 
-
-
-      CALL Zero_Integer (Isopar, Ndasig)
 !
       IF (Kadddc.NE.0) THEN
 ! ***    Read and organize direct capture information; Cdrcpt = X/(4pi E)
          CALL Read_Direct_Capture (Edrcpt, Cdrcpt, Ndrcpt,  &
             Nnndrc)
       END IF
-!
-! *** Organize for which derivative routines need to be called in Crosss
-      CALL Which_Derivs ()
 !      
       irow = 0
       istart = 0
@@ -129,8 +128,6 @@ module xct2_m
          CALL Zero_Array (A_Iccoul , 2*Ntotc*Ng*numEl)
          IF (Nnpar.GT.0) CALL Zero_Array (A_Idcoul , &
                              2*Ntotc*Ng*numEl*Nnpar)
-          CALL Zero_Array (A_Icx, Ntotc*Ng)
-          CALL Start_Coul (A_Izke , A_Icx)
       END IF
 !
       Idrcp = 1
@@ -159,20 +156,31 @@ module xct2_m
             end if
          end if
          irow = irow + 1
-
+         calc%row = irow
+         calc%ener = grid%getEnergy(Jdat, expData)         
 
 !
             IF (Su.GT.Emax .AND. Kartgd.EQ.1) THEN
-               Sigxxx(1,1) = Zero
+               ! if Kartgd.EQ.1 and more than one isotope
+               ! SAMMY did not zero the cross section for isotopes 2, 3, ...
+               ! but reused the previous value
+               ! todo: delete this to make the code correct
+               do Iso=2,Iq_Iso
+                  do is = 1, Nnnsig
+                     val = derivs%getDataNs(irow-1, is, 0, iso)
+                     call derivs%addDataNs(irow, is, 0, iso, val)
+                  end do
+               end do
                GO TO 20
             END IF
             IF (Su.LT.Zero) Su = - Su
 
             IF (Kadddc.NE.0) CALL Find_Drcpt (Edrcpt, Cdrcpt, Xdrcpt, &
-               Ndrcpt, Nnndrc, Idrcp, Su)
+               Ndrcpt, Nnndrc, Idrcp, Su)              
 !
 ! ********* Start regular calculation
             Squ = dSQRT(Su)
+            calc%enerSq = Squ
 ! ********* Su  = E = m Dist^2 Elzero^2 / [2 (t-Tzero)^2]
 ! ********* Squ = Tttzzz * Dist * Elzero / (t-Tzero)
 ! *********       Tttzzz = sqrt(m/2) * conversion factors = 72.3
@@ -191,66 +199,29 @@ module xct2_m
 !
             IF (Kgauss.EQ.1) THEN
 ! ************ Want dummy Gaussian resonances
-               CALL Zgauss (A, Sigxxx, grid%getEnergy(Jdat, expData))
+               CALL Zgauss (resparData, val, grid%getEnergy(Jdat, expData))
+               call calc%crossData%addDataNs(calc%row, 1, 0, 1, val)
             ELSE
 !
 ! ************ Generate cross sections and derivatives
                IF (Nd_Xct.NE.0 .AND. Ksolve.NE.2) THEN
-                  CALL N_D_Zcross (calc, Kount_Helmut)
+                  CALL N_D_Zcross (calc)
                ELSE
-                  CALL Zcross (calc, Nnndrc, Ipoten, Kount_Helmut)
+                  CALL Zcross (calc, Nnndrc, Ipoten)
                END IF
 !
 ! ************ Store Coul if needed
                IF (IfCoul.GT.0) THEN
-                  CALL Store_Coul (A_Iccoul , A_Idcoul , A_Icrssx , &
-                     A_Idervx , A_Icx , Jdat)
+                  CALL Store_Coul (A_Iccoul , A_Idcoul ,  &
+                     calc%angInternal, calc%Ccoulx , Jdat)
                END IF
 !
 ! ************    Set the particular cross sections needed for this run
-               CALL Zwhich (calc, Sigxxx, Dasigx, Dbsigx, Sigsin, &
-                  Dasigs, Dbsigs, Theoryx, Su,              &
-                  grid%getEnergy(Jdat, expData), Lllmmm, Kslow)
-               IF (Kfake.EQ.1) THEN
-                  call derivs%addDataNs(Jdat, 1, 0, 1, Theoryx)
-                  cycle
-               END IF
+               CALL Zwhich (calc)
             END IF
 !
    20       CONTINUE
 
-
-           do Iipar = 1, Ndasig
-              ! Make sure the isotope indices in derivs are consistent
-              ! with the ones given in Isopar.
-              ! This only matters if there are more than one isotope
-              ! (Iq_Iso > 1) and if we don't already have the same value
-              ! (derivs%getIsotopeForShared(Iipar).eq.Isopar(Iipar))
-              ! The value for Isopar(Iipar) is not always set, i.e. is 0, in the
-              ! subroutines called from this routine (derivative is zero for
-              ! example). But the derivs  object needs to have a  value between 1 <= Iso <= Iq_Iso,
-              ! for all parameters <= Ndasig, so we populated it to 1 at the beginning
-              ! of this subroutine
-              if (Iq_Iso.gt.1.and.Isopar(Iipar).gt.1.and.  &
-                  derivs%getIsotopeForShared(Iipar).ne.Isopar(Iipar)) then
-                 call derivs%addSharedColumn(Iipar, Isopar(Iipar))
-                 if (Iw.eq.1.or.Ksitmp.gt.0) THEn
-                    call derivsSelf%addSharedColumn(Iipar, Isopar(Iipar))
-                 end if
-              end if
-            end do
-            do Iso=1,Iq_Iso
-               call derivs%addCalculatedData(irow, Nnnsig, ndasig, &
-                      ndbsig, iso, Sigxxx(1:Nnnsig,Iso), Dasigx, Dbsigx(1:Nnnsig,1:Ndbxxx,Iso))
-            end do
-
-            IF (Iw.EQ.1) THEN
-               do Iso=1,Iq_Iso
-                 call derivsSelf%addCalculatedData(irow, 1, ndasig, &
-                         ndbsig, Iso, Sigsin(Iso), Dasigs, Dbsigs(1:Ndbxxx,Iso))
-               end do
-            END IF
-
 !
       END DO
 
@@ -258,6 +229,9 @@ module xct2_m
 !
 !
       call grid%destroy()
+      accu = .false.
+      call derivs%setAccumulate(accu)
+      call derivsSelf%setAccumulate(accu)
 
 !
       RETURN
diff --git a/sammy/src/xct/mxct03.f90 b/sammy/src/xct/mxct03.f90
index 821a53c77..449ae7cc1 100644
--- a/sammy/src/xct/mxct03.f90
+++ b/sammy/src/xct/mxct03.f90
@@ -1,38 +1,42 @@
 !
 module xct3_m
+  use XctCrossCalc_M
+
+  real(kind=8),allocatable,dimension(:,:)::unpertCross
+  real(kind=8),allocatable,dimension(:,:,:,:)::unpertAng
+
   contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE N_D_Zcross (calc, Kount_Helmut)
+      SUBROUTINE N_D_Zcross (calc)
 !
 ! *** PURPOSE -- Calculate numerically the partial derivatives 
 ! ***               of the cross section wrt R-matrix parameters
 !
-      use oops_common_m
-      use fixedi_m
-      use ifwrit_m
+      use fixedi_m, only : Kpolar
       use exploc_common_m
-      use fixedr_m
-      use broad_common_m
       use templc_common_m
-      use EndfData_common_m
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
       use xct1_m
       use xct5_m
-      use mxct06_m
-      use XctCrossCalc_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct06_m      
+      use AllocateFunctions_m
+      IMPLICIT none
 !
 !
       type(SammyResonanceInfo)::resInfo
       type(RMatResonance)::resonance
       type(SammySpinGroupInfo)::spinInfo
       class(XctCrossCalc)::calc
+      integer::ng, ir, ir2, ig
+      logical::wantDerivsSave
 !
-      DATA Zero /0.0d0/, One /1.0d0/
-      DATA U_Increment /0.0001d0/
+      real(kind=8),parameter:: Zero = 0.0d0, One = 1.0d0
+      real(kind=8),parameter:: U_Increment = 0.0001d0
+      real(kind=8)::B, eres, G1, G2, G3, X
+      integer::ichan, Iflr, iGam, Igrp, Ires, M, M2, Nnndrc, Ntotn, Ntotn2
 !
 !
       B  = Zero
@@ -40,47 +44,52 @@ module xct3_m
       G2 = Zero
       G3 = Zero
 !
-      IF (resParData%getNumResonances().EQ.0) &
+      IF (calc%resData%getNumResonances().EQ.0) &
         STOP '[No resonances for num derivs  in N_D_Zcross in mxct03.f]'
-      Ksolve_N_D = Ksolve
-      Ksolve = 2
+      wantDerivsSave = calc%wantDerivs
+      calc%wantDerivs = .false.
 !
 ! *** First, for the original parameter values --
 !     *** Generate energy-independent pieces
 !   True is passed to babb since it is used to set parameters for numerical differentiation      
-     CALL Babb (   calc, .true.)
-     CALL Abpart (  calc, &
-       A_Ixden  , &
-       A_Idifma , I_Inotu  ,                       &
-       A_Iprer  , A_Iprei )
+     CALL Babb (calc, .true.)
+     CALL Abpart (calc)
 !
 ! *** Form the cross section Crss
       CALL Crosss ( calc,   &
-           I_Ifexcl , &
-           A_Ibound , A_Iechan , I_Ifcros ,  &
-           A_Iprmsc , I_Iflmsc , I_Ijkmsc , A_Izke   , &
-           A_Izeta  ,                                  &
-           A_Icrss  , A_Ideriv ,            &
-           A_Icrssx , A_Idervx , A_Iprer  , A_Iprei  , A_Ixdrcp , &
-           I_Indrcp , Nnndrc, 0, Kount_Helmut)
-!
-      IF (Ncrssx.NE.0) THEN
-         N = Ncrsss*Nnpar*resParData%getNumSpinGroups()
-         IF (N.NE.0) CALL Zero_Array (A_Ideriv , N)
-      END IF
-      IF (Ifdif.NE.0) THEN
-         N = 2*Ntotc*Ntotc*Nnpar*resParData%getNumSpinGroups()
-         IF (N.NE.0) CALL Zero_Array (A_Idervx , N)
-      END IF
+           A_Iprmsc , I_Iflmsc , I_Ijkmsc,   &
+           A_Ixdrcp , &
+           I_Indrcp , Nnndrc, 0)
+!
+      ng = calc%resData%getNumSpinGroups()
+      call reallocate_real_data_2d(unpertCross, calc%ntotc+1, 0,  ng, 0)
+      do ig = 1, ng
+         do ir = 1, calc%ntotc+1
+            unpertCross(ir, ig) = calc%crossInternal(ir, ig, 0)
+         end do
+      end do
+      if (calc%needAngular) then
+         if (.not.allocated(unpertAng)) then
+            allocate(unpertAng(2, calc%ntotc+1, calc%ntotc+1, ng))
+         end if
+         do ig = 1, ng
+            do ir = 1, calc%ntotc+1
+               do ir2 = 1, calc%ntotc+1
+                  unpertAng(1, ir, ir2, ig) = calc%angInternal(1, ir,ir2, ig, 0)
+                  unpertAng(2, ir, ir2, ig) = calc%angInternal(2, ir,ir2, ig, 0)
+               end do
+            end do
+         end do
+      end if
 !
 ! *** Now vary parameters one-by-one to get derivatives
-      DO Ires=1,resParData%getNumResonances()
-        call resParData%getResonanceInfo(resInfo,  Ires)
+      DO Ires=1,calc%resData%getNumResonances()
+        call calc%resData%getResonanceInfo(resInfo,  Ires)
 
         
         IF (resInfo%getEnergyFitOption().GE.0) THEN           
           Igrp =  resInfo%getSpinGroupIndex()
-          call resparData%getSpinGroupInfo(spinInfo, Igrp)
+          call calc%resData%getSpinGroupInfo(spinInfo, Igrp)
           if (spinInfo%getGammaWidthIndex().gt.0) then
               write(0,*)" Combined gamma width and numerical derivatives are not supported"
               stop
@@ -89,7 +98,7 @@ module xct3_m
           Ntotn2 = spinInfo%getNumResPar()
           iGam = spinInfo%getGammaWidthIndex()
 
-          call  resParData%getRedResonance(resonance, resInfo)
+          call  calc%resData%getRedResonance(resonance, resInfo)
           
           DO M=1,Ntotn2
              if (m.eq.1) then
@@ -98,7 +107,7 @@ module xct3_m
                 Iflr = resInfo%getChannelFitOption(m-1)
              end if
              IF (Iflr.GT.0) THEN              
-               IF (covData%contributes(Iflr)) THEN
+               IF (calc%covariance%contributes(Iflr)) THEN
 !
 !
                    IF (M.EQ.1) THEN
@@ -136,25 +145,16 @@ module xct3_m
 !
 ! ***              Generate energy-independent pieces with new parameter
                    CALL Babb ( calc,  .true.)
-                   CALL Abpart (calc,     &
-                     A_Ixden  , &
-                     A_Idifma ,  &
-                     I_Inotu  , A_Iprer  , A_Iprei  )
+                   CALL Abpart (calc)
 !
 ! ***              Form the cross section Crss with new parameter value
                    CALL Crosss (  calc,  &
-                        I_Ifexcl , A_Ibound , A_Iechan , &
-                        I_Ifcros ,  &
-                        A_Iprmsc , I_Iflmsc , I_Ijkmsc , A_Izke  , &
-                        A_Izeta  ,                                 &
-                        A_Icrsnd , A_Ideriv , A_Icrxnd , A_Idervx , &
-                        A_Iprer  , A_Iprei  , A_Ixdrcp , I_Indrcp , &
-                        Nnndrc, 0, Kount_Helmut)
+                        A_Iprmsc , I_Iflmsc , I_Ijkmsc ,  &
+                        A_Ixdrcp , I_Indrcp , &
+                        Nnndrc, 0)
 !
 ! ***              Generate numerical derivatives
-                   CALL Fix_N_D (A_Icrss , A_Icrssx , A_Ideriv , &
-                     A_Idervx , A_Icrsnd , A_Icrxnd , X, &
-                     Iflr, Igrp, Ntotn)
+                   CALL Fix_N_D (calc, X,  Iflr, Igrp, Ntotn)
 !
 ! ***              Reset original parameters
                    IF (M.EQ.1) THEN
@@ -176,43 +176,51 @@ module xct3_m
       END DO
 !
 !
-      Ksolve = Ksolve_N_D
+      calc%wantDerivs = wantDerivsSave
       RETURN
       END
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Fix_N_D (Crss, Crssx, Deriv, Derivx, Crss_N_D, &
-         Crssx_N_D, X, Iipar, Igrp, Ntotn)
+      SUBROUTINE Fix_N_D (calc, X, Iipar, Igrp, Ntotn)
 !
 ! *** PURPOSE -- Calculate numerically the partial derivatives 
 !
       use fixedi_m
       use ifwrit_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      IMPLICIT none
 !
-      DIMENSION Crss(Ncrsss,*), Crssx(2,Ntotc,Ntotc,*), &
-         Crss_N_D(Ncrsss,*), Crssx_N_D(2,Ntotc,Ntotc,*), &
-         Deriv(Ncrsss,Nnpar,*), Derivx(2,Ntotc,Ntotc,Nnpar,*)
+      class(XctCrossCalc)::calc
+      real(kind=8)::un, per,val
+      integer::Iipar, Igrp, Ntotn
+      real(kind=8)::X, Two_X
+      integer::K, Nchan, Nchanx
 !
       IF (Ncrssx.GT.0) THEN
          DO K=1,Ncrsss
-            Deriv(K,Iipar,Igrp) = - (Crss(K,Igrp)-Crss_N_D(K,Igrp))/X
+            un = unpertCross(k, Igrp)
+            per =  calc%crossInternal(K, igrp, 0)
+            val = - (un-per)/X
+            if (val.ne.0) then
+              calc%crossInternal(K, Igrp, Iipar) = val
+            end if
          END DO
       END IF
 !
       Two_X = X/2.0d0
 ! *** Note that factor-of-two is removed when calculate Dddlll
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
          DO Nchan=1,Ntotn
             Do Nchanx=1,Ntotn
-               Derivx(1,Nchanx,Nchan,Iipar,Igrp) = - ( &
-                   Crssx(1,Nchanx,Nchan,Igrp) -  &
-                   Crssx_N_D(1,Nchanx,Nchan,Igrp) ) / Two_X
-               Derivx(2,Nchanx,Nchan,Iipar,Igrp) = - ( &
-                   Crssx(2,Nchanx,Nchan,Igrp) -  &
-                   Crssx_N_D(2,Nchanx,Nchan,Igrp) ) / Two_X
+               un = unpertAng(1, Nchanx,Nchan, Igrp)
+               per =  calc%angInternal(1, Nchanx,Nchan, Igrp, 0)
+               val = - (un-per)/Two_X
+               calc%angInternal(1,Nchanx,Nchan,Igrp, Iipar) = val
+               un = unpertAng(2, Nchanx,Nchan, Igrp)
+               per =  calc%angInternal(2, Nchanx,Nchan, Igrp, 0)
+               val = - (un-per)/Two_X
+               calc%angInternal(2,Nchanx,Nchan,Igrp, Iipar) = val
             END DO
          END DO
       END IF
diff --git a/sammy/src/xct/mxct04.f90 b/sammy/src/xct/mxct04.f90
index 4b90307f6..4995bf7ac 100644
--- a/sammy/src/xct/mxct04.f90
+++ b/sammy/src/xct/mxct04.f90
@@ -4,7 +4,7 @@ module xct4_m
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Zcross (calc, Nnndrc, Ipoten, Kount_Helmut)
+      SUBROUTINE Zcross (calc, Nnndrc, Ipoten)
 !
 ! *** PURPOSE -- FORM THE CROSS SECTION Crss
 ! ***            AND THE ( PARTIAL DERIVATIVES OF THE CROSS SECTION
@@ -31,11 +31,8 @@ module xct4_m
 !
 ! *** Generate Pr and Pi = Partial of R wrt U-parameters
 ! ***    from Upr and Upi = energy-dependent pieces of those derivs    
-      IF (resParData%getNumResonances().NE.0)  then
-         CALL Abpart (  calc,  &
-         A_Ixden  , &
-         A_Idifma , I_Inotu  , A_Iprer  , A_Iprei )
-         end if
+
+         CALL Abpart (calc)
 !
 ! *** Generate Pgar & Pgai = partial of R wrt (Gamma-x) *
 ! ***                        partial (Gamma_x) wrt radius
@@ -68,19 +65,15 @@ module xct4_m
       end if
 
       IF (doRadDeriv) THEN
-          CALL Abpga ( calc, A_Ipgar, A_Ipgai, Nfprrr)
+          CALL Abpga (calc)
       END IF
 !
 ! *** FORM THE CROSS SECTION Crss AND THE ( PARTIAL DERIVATIVES OF THE
 ! ***    CROSS SECTION WITH RESPECT TO THE VARIED PARAMETERS ) = Deriv
       CALL Crosss (  calc, &
-           I_Ifexcl , &
-           A_Ibound , A_Iechan , I_Ifcros , &
-           A_Iprmsc , I_Iflmsc , I_Ijkmsc , A_Izke   , &
-           A_Izeta  ,                                  &
-           A_Icrss  , A_Ideriv ,                       &
-           A_Icrssx , A_Idervx , A_Iprer  , A_Iprei  , A_Ixdrcp , &
-           I_Indrcp , Nnndrc, Ipoten, Kount_Helmut)
+           A_Iprmsc , I_Iflmsc , I_Ijkmsc ,    &
+           A_Ixdrcp , &
+           I_Indrcp , Nnndrc, Ipoten)
 !
       RETURN
       END
diff --git a/sammy/src/xct/mxct05.f90 b/sammy/src/xct/mxct05.f90
index 31fc9648c..fb2083125 100644
--- a/sammy/src/xct/mxct05.f90
+++ b/sammy/src/xct/mxct05.f90
@@ -4,9 +4,7 @@ module xct5_m
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Abpart (calc, &
-         Xden, &
-         Difmax, Notu, Prer, Prei)
+      SUBROUTINE Abpart (calc)
 !
 ! *** Purpose -- Generate Alphar & Alphai = energy-independent bits
 ! ***            and Upr and Upi = Energy-dependent pieces of Pr & Pi
@@ -25,10 +23,6 @@ module xct5_m
       IMPLICIT None
 !
 !
-      real(kind=8):: &
-         Xden(*), Difmax(*), &
-         Prer(Ntriag,*), Prei(Ntriag,*)
-      integer:: Notu(*)
       type(SammyResonanceInfo)::resInfo
       type(SammySpinGroupInfo)::spinInfo
       type(RMatResonance)::resonance
@@ -38,11 +32,6 @@ module xct5_m
       class(XctCrossCalc)::calc
       real(kind=8)::Upi, Upr
 !     
-!      DIMENSION 
-!     *     Xden(Nres),
-!     *     Difmax(Nres),
-!     *     Prer(Ntriag,Ngroup),
-!     *     Prei(Ntriag,Ngroup)
 !
       DATA Zero /0.0d0/, One /1.0d0/, Two /2.0d0/
 !
@@ -51,7 +40,7 @@ module xct5_m
 !
       calc%needAlphai = .false.
       DO N=1,resParData%getNumResonances()
-         Xden(N) = Zero
+         calc%Xden(N) = Zero
          calc%Alphar(N) = Zero
          calc%Alphai(N) = Zero
          call resParData%getResonanceInfo(resInfo, N)
@@ -66,14 +55,14 @@ module xct5_m
                if (calc%doResShift) then
                   calc%Difen(N) =  calc%Difen(N) + calc%Xx(N)
                end if
-               IF (Dabs(calc%Difen(N)).LT.1.0D8*Difmax(N)) calc%needAlphai(N) = .true.
+               IF (Dabs(calc%Difen(N)).LT.1.0D8*calc%Difmax(N)) calc%needAlphai(N) = .true.
                ichan = spinInfo%getGammaWidthIndex()
                G2 = resonance%getWidth(ichan)**2
                G3 = G2**2
                Aa = calc%Difen(N)**2 + g3
-               Xden(N) = One/Aa
-               calc%Alphar(N) = calc%Difen(N)*Xden(N)
-               calc%Alphai(N) = G2*Xden(N)
+               calc%Xden(N) = One/Aa
+               calc%Alphar(N) = calc%Difen(N)*calc%Xden(N)
+               calc%Alphai(N) = G2*calc%Xden(N)
             END IF
          END IF
       END DO
@@ -83,7 +72,7 @@ module xct5_m
 !
 ! *** if ( (do not solve) or (no resonance parameters are varied) )
 ! ***    then don't  do this
-      IF (needResDerivs) THEN
+      IF (calc%wantDerivs) THEN
          Ipar = 0
          ires = 0
 
@@ -104,15 +93,15 @@ module xct5_m
                N   =  calc%Inum(K,3)   ! index of resonance
                Upr = 0.0d0
                Upi = 0.0d0
-               IF (Dabs(calc%Difen(N)).LE.Difmax(N)) THEN
+               IF (Dabs(calc%Difen(N)).LE.calc%Difmax(N)) THEN
                   Upr = calc%Alphar(N)
                   Upi = calc%Alphai(N)
                   IF (M.EQ.1) THEN ! Variable is resonance-energy
                      Upi = Upr*Upi
-                     Upr = Xden(N) - Two*Upr*Upr
+                     Upr = calc%Xden(N) - Two*Upr*Upr
                   ELSE IF (M.EQ.2) THEN ! Variable is capture width
                      Upr = Upr*Upi
-                     Upi = Xden(N) - Two*Upi*Upi
+                     Upi = calc%Xden(N) - Two*Upi*Upi
                   END IF
                end if
 
@@ -133,8 +122,9 @@ module xct5_m
 
       IF (Itzero.NE.0 .OR. Ilzero.NE.0) THEN
 !         
-         CALL Zero_Array (Prer, resParData%getNumSpinGroups()*Ntriag)
-         CALL Zero_Array (Prei, resParData%getNumSpinGroups()*Ntriag)
+         calc%Prer = 0.0d0
+         calc%Prei = 0.0d0
+
          DO Ig=1,resParData%getNumSpinGroups()  
             call resParData%getSpinGroupInfo(spinInfo, ig)
             DO N=1,resParData%getNumResonances()
@@ -156,9 +146,9 @@ module xct5_m
                         Ij = Ij + 1
                         ichan = spinInfo%getWidthForChannel(Ijl)
                         channelWidthCPrime = resonance%getWidth(ichan)
-                        Prer(Ij,Ig) = Prer(Ij,Ig) + &
+                        calc%Prer(Ij,Ig) = calc%Prer(Ij,Ig) + &
                                    Aa*channelWidthC*channelWidthCPrime
-                        Prei(Ij,Ig) = Prei(Ij,Ig) + &
+                        calc%Prei(Ij,Ig) = calc%Prei(Ij,Ig) + &
                                    Bb*channelWidthC*channelWidthCPrime
 !                      Pre = partial of R wrt E
 !                      R = sum_N {gamma_i gamma_j / [E_N-E +i gamma_g]}
@@ -175,7 +165,7 @@ module xct5_m
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Abpga (calc, Pgar, Pgai, Nfprrr)
+      SUBROUTINE Abpga (calc)
 !
 ! *** PURPOSE -- generate Pgar and Pgai = partial of R wrt unvaried
 ! ***               width-parameters
@@ -186,39 +176,54 @@ module xct5_m
       use EndfData_common_m
       use SammySpinGroupInfo_M
       use XctCrossCalc_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      IMPLICIT none
 !
 !
       type(SammyResonanceInfo)::resInfo
       type(SammySpinGroupInfo)::spinInfo
       class(XctCrossCalc)::calc
-      DIMENSION   Pgar(Ntriag,Nfprrr,*), Pgai(Ntriag,Nfprrr,*)
+      logical::hasRad
 !
-      DATA Zero /0.0d0/
+      real(kind=8),parameter:: Zero = 0.0d0
+      integer::ix, Ifl, Ign, Ij, Iz, Mchan, Numrrr, Ires
 !
 !
-      Numrrr = Numrad
-      IF (Numrad.EQ.0) Numrrr = Nfprrr
-      ng = resParData%getNumSpinGroups()
-      CALL Zero_Array (Pgar, Ntriag*Nfprrr*ng)
-      CALL Zero_Array (Pgai, Ntriag*Nfprrr*ng)
+      hasRad = .false.
+      if( allocated(calc%iradIndex)) then
+           hasRad = any(calc%iradIndex.ne.0)
+      end if
+      if( .not.hasRad) return  ! no radius adjustment
+
+      Numrrr = size(calc%iradIndex)
+      calc%Pgar = 0.0d0
+      calc%Pgai = 0.0d0
+
 !
 ! *** Multiply by Bga to give partial of R wrt radius
 !
-      DO Ires=1,resParData%getNumResonances()
-         call resParData%getResonanceInfo(resInfo, ires)
+      DO Ires=1,calc%resData%getNumResonances()
+         call calc%resData%getResonanceInfo(resInfo, ires)
          IF (resInfo%getIncludeInCalc()) THEN             
             ign = resInfo%getSpinGroupIndex()
             call resParData%getSpinGroupInfo(spinInfo, ign)           
             DO Mchan=1,spinInfo%getNumChannels()
-               Ix = radFitFlags%getTrueFitFlag(Ign, Mchan)
-               IF (Ix.GT.0) THEN
-                  Ix = Ix - Nfpres - Nfpext
+               Ifl = calc%radiusData%getTrueFitFlag(Ign, Mchan)
+               IF (Ifl.GT.0) THEN
+                  ! It's adjusted, find its position
+                  ! in Pgar and Pgai
+                  Ix =  0
+                  do Iz = 1, Numrrr
+                     if (Ifl.eq.calc%iradIndex(Iz)) then
+                         Ix = Iz
+                         exit
+                      end if
+                  end do
+
                   DO Ij=1,Ntriag
                      IF (calc%Bga(IJ,Mchan,Ires).NE.Zero) THEN
-                        Pgar(IJ,Ix,Ign) = Pgar(Ij,Ix,Ign) + &
+                        calc%Pgar(IJ,Ix,Ign) = calc%Pgar(Ij,Ix,Ign) + &
                            calc%Bga(IJ,Mchan,Ires)*calc%Alphar(Ires)
-                        Pgai(IJ,Ix,Ign) = Pgai(Ij,Ix,Ign) + &
+                        calc%Pgai(IJ,Ix,Ign) = calc%Pgai(Ij,Ix,Ign) + &
                            calc%Bga(IJ,Mchan,Ires)*calc%Alphai(Ires)
                      END IF
                   END DO
diff --git a/sammy/src/xct/mxct06.f90 b/sammy/src/xct/mxct06.f90
index e54e2a76b..cbd650de4 100644
--- a/sammy/src/xct/mxct06.f90
+++ b/sammy/src/xct/mxct06.f90
@@ -6,296 +6,177 @@ contains
 ! --------------------------------------------------------------
 !
       SUBROUTINE Crosss (  calc,  &
-         Jfexcl, Bound  , Echan  ,   &
-         Jfcros, Parmsc, Jflmsc , Jjkmsc , Zke   ,   &
-         Zeta  ,   &
-         Crss  , Deriv , Crssx , Derivx , Prer   , Prei  ,   &
-         Xdrcpt, Ndrcpt, Nnndrc, Ipoten, Kount_Helmut)
+         Parmsc, Jflmsc , Jjkmsc ,  &
+         Xdrcpt, Ndrcpt, Nnndrc, Ipoten)
 !
 ! *** PURPOSE -- Form the cross sections Crss(Isigma,Igroup) and the
 ! ***   ( partial derivatives of the cross section with respect to
 ! ***   the varied parameters ) = Deriv(Isigma,Iipar,Igroup)
 !
-      use over_common_m
-      use oops_common_m
-      use fixedi_m
-      use ifwrit_m
-      use exploc_common_m
-      use fixedr_m
-      use broad_common_m
-      use varyr_common_m
-      use templc_common_m
-      use constn_common_m
-      use EndfData_common_m
+      use fixedi_m, only : Nucdrc, Nummsc
+      use ifwrit_m, only : Kadddc
+
       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
+      use par_parameter_names_common_m, only : Nammsc
 
       use Derrho_m
       use xct7_m
       use mxct11_m
       use mxct12_m
+      use mxc15_m
+      use mxct16_m
+      use mxct17_m
       use mthe1_m
+      use mxct09_m
+      use mxct10_m
+      use mxct13_m
+      use mxct08_m
       implicit none
 
       class(XctCrossCalc)::calc
-      real(8), intent(in):: Bound, Echan, Parmsc, Zke, Zeta,   &
-                            Crssx, Derivx, Prer, Prei, Xdrcpt
-      real(8), intent(out):: Crss, Deriv
-      integer(4), intent(in):: Jfexcl, Jfcros, Jflmsc, Jjkmsc,   &
+      real(8), intent(in):: Parmsc,  Xdrcpt
+      integer(4), intent(in):: Jflmsc, Jjkmsc,   &
                                Ndrcpt,   &
-                               Nnndrc, Ipoten, Kount_Helmut
+                               Nnndrc, Ipoten
 
-      real(8):: Zero, Dgoj
-      integer(4):: i, I_Re_Setr, Iiidrc, Ijk, Ipar, Krext, Lrmat, Maxr,   &
-                   Minr, N, Nentnn, Nextnn, Nn2, Nnext, Ntotnn
+      integer(4):: i,  Iiidrc, Ijk, Ipar, Lrmat,   &
+                   Minr, N, Ntotnn
 !
-      DIMENSION Jfexcl(Ntotc,*),   &
-         Bound(Ntotc,*), Echan(Ntotc,*),   &
-         Jfcros(*),   &
+      DIMENSION  &
          Parmsc(*), Jflmsc(*), Jjkmsc(*),   &
-         Crss(Ncrsss,*), Deriv(Ncrsss,Nnpar,*), Crssx(2,Ntotc,Ntotc,*),   &
-         Derivx(2,Ntotc,Ntotc,Nnpar,*), Zke(Ntotc,*),   &
-         Zeta(Ntotc,*),Prer(Ntriag,*), Prei(Ntriag,*),   &
          Xdrcpt(*), Ndrcpt(*)
-!
-!      DIMENSION
-!     *   Jfexcl(Ntotc,Ngroup), Bound(Ntotc,Ngroup),
-!     *   Echan(Ntotc,Ngroup), Jfcros(Ncrsss),
-!     *   Crss(Ncrsss,Ngroup), Deriv(Ncrsss,Nnpar,Ngroup),
-!     *   Crssx(2,Ntotc,Ntotc,Ngroup), Derivx(2,Ntotc,Ntotc,Nnpar,Ngroup),
-!     *   Zke(Ntotc,Ngroup),
-!     *   Prer(Ntriag,Ngroup), Prei(Ntriag,Ngroup)
 !
       type(SammySpinGroupInfo)::spinInfo
       type(SammyResonanceInfo)::resInfo
       type(SammyRExternalInfo)::rextInfo
-      integer::M,iflabund, j
-      logical::needDeriv,ifcap
-      DATA Zero /0.0d0/
+      integer::M,iflabund, j, iparStart, istart
+      logical::needDeriv, needDerivPlus
+      real(kind=8)::val
 !
 !
-      IF (Ks_Res.NE.2) THEN
-         IF (Ncrssx.NE.0) THEN
-            N = Ncrsss*Nnpar*Ngroup
-            IF (N.NE.0) CALL Zero_Array (Deriv, N)
-         END IF
-         IF (Ifdif.NE.0) THEN
-            N = 2*Ntotc*Ntotc*Nnpar*Ngroup
-            IF (N.NE.0) CALL Zero_Array (Derivx, N)
-         END IF
-      END IF
-!
-      Krext = Nrext
-      IF (Krext.EQ.0) Krext = 1
 !
-      Nn2 = 0
-      Kstart = 0
-      Jstart = Nfpres ! Jstart+1 starts derivatives external R-Matrix
-      IF (Ncrssx.NE.0) THEN
-         CALL Zero_Array (Crss, Ngroup*Ncrsss)
-      END IF
-      IF (Ifdif.NE.0) THEN
-         CALL Zero_Array (Crssx, 2*Ntotc**2*Ngroup)
-      END IF
+      calc%crossInternal = 0.0d0
+      if (calc%needAngular) then
+         calc%angInternal = 0.0d0
+      end if
 !
 !
 ! *** DO LOOP OVER GROUPS (IE SPIN-PARITY GROUPS)  -
 ! ***    GOES TO END OF ROUTINE
 !
-      maxr  = 0
-      DO N=1,resParData%getNumSpinGroups()
-          call resParData%getSpinGroupInfo(spinInfo, N)
-          minr = maxr + 1
-          call  getParamPerSpinGroup(maxr, N, Npr, needDeriv,   &
-                                     Kstart, ifcap)
-         
-         Nnnn = N         
-         Ntotnn = spinInfo%getNumChannels()
-         IF (Ifdif.NE.0) CALL Zero_Array (A_Icscs, 2*Ntriag)
+      istart = 0
+      iparStart = 0
+      DO N=1,calc%resData%getNumSpinGroups()
+          call calc%resData%getSpinGroupInfo(spinInfo, N)
+          minr = istart + 1
+          call calc%getParamPerSpinGroup(istart, N)
+          needDeriv = calc%inumSize.gt.0
+          needDerivPlus = needDeriv.or.calc%Ifzzz.or.calc%Ifext.or.calc%Ifrad.or.calc%Ifradt
+          if (.not.calc%wantDerivs) needDeriv = .false.
+
+         Ntotnn = spinInfo%getNumChannels()         
+         if (calc%needAngular) calc%cscs = 0.0d0
          IF (spinInfo%getIncludeInCalc()) THEN
-            VarAbn = spinInfo%getAbundance()
-!
-            Nnnn = N
-            Npx = 0          
-            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
+!
 !
 !
 ! ***       Set R-Matrix and other necessary arrays
             Lrmat = 0
 
-            
-            Nentnn = spinInfo%getNumEntryChannels()
-            Nextnn = spinInfo%getNumExitChannels()
-            CALL Setr (calc, Nentnn, Ntotnn, N,   &
-               Bound(:,N), Echan(:,N),   &
-               A_Isinsq , A_Isinph, A_Idphi, A_Icscs,   &
-               A_Iss, A_Icc , Zke(:,N), Zeta(:,N),   &
-               A_Idpdr, A_Idsdr,   &
-               A_Irmat, A_Iymat, A_Irootp, A_Linvr, A_Linvi,   &
-               A_Ipsmal, Krext, Lrmat, Minr, Maxr, Ipoten)
-!
-            I_Re_Setr = 0
-            DO I=1,Ntotnn
-               IF (Jfexcl(I,Nnnn).LT.0) I_Re_Setr = 1
-            END DO
-            IF (I_Re_Setr.EQ.1) THEN
-! ***          If any Jfexcl are < 0, that channel is excluded from
+            CALL Setr (calc, spinInfo, N, Lrmat, Minr, Ipoten)
+!
+! ***          If any channel is completely excluded from
 ! ***             the entire calculation (not just from final state)
-               CALL Re_Setr (Nentnn, Ntotnn, A_Isinsq , A_Isinph ,   &
-               A_Idphi , A_Icscs, A_Iss , A_Icc, A_Idpdr, A_Idsdr,   &
-               A_Irmat, A_Iymat, A_Irootp, A_Linvr, A_Linvi,   &
-               Jfexcl(:,Nnnn))
-            END IF
+!               set its information to zero
+            CALL Re_Setr (calc, spinInfo, N)
+
 !
             IF (Lrmat.EQ.1) THEN
 ! ***          Calculate Xq & Xxxx matrices if trivial
-               CALL Zeror (A_Ixxxxr, A_Ixxxxi, A_Ixqr, A_Ixqi,   &
-                  A_Ipxrr, A_Ipxri, Ntotnn)
+               CALL Zeror (calc)
             ELSE
 ! ***          Invert Ymat; note that Xqr is "Dummy" here
-               CALL Yinvrs (A_Iymat, A_Iyinv, A_Ixqr, Ntotnn)
+               CALL Yinvrs (calc, Ntotnn)
 ! ***          Generate XQ & Xxxx matrices
-               CALL Setxqx (Ntotnn, A_Iyinv, A_Irmat, A_Ixqr, A_Ixqi,   &
-                  A_Irootp, A_Linvr, A_Linvi, A_Ixxxxr, A_Ixxxxi)
+               CALL Setxqx (calc, Ntotnn)
             END IF
 !
-            Dgoj = spinInfo%getGFactor()
 ! ***       generate cross section pieces
-            CALL Sectio (Nentnn, Nextnn, N, Echan(:,N),   &
-               Jfexcl(:,N), Jfcros, Zke(:,N), Zeta(:,N), A_Ixxxxr,   &
-               A_Ixxxxi, A_Isinsq , A_Isinph, A_Itermf, Crss(:,N),   &
-               Crssx, A_Icscs, Dgoj, Ntotnn)
-!
-            IF (Ks_Res.NE.2) THEN
-               IF ( Lrmat.EQ.0                 .AND.   &
-                  ( needDeriv .OR.   &
-                    (Npx.NE.0 .AND. Ifext .EQ.0) .OR.   &
-                   Ifzzz.EQ.0 .OR.  Ifradt.EQ.0 ) ) THEN
+            CALL Sectio (spinInfo, calc, N)
+
+            IF (calc%wantDerivs) THEN
+               IF ( Lrmat.EQ.0.and.needDerivPlus) THEN
 !
 ! ***             Generate Q = partial Derivative of Xxxx wrt R
-                  CALL Setqri (A_Iyinv, A_Ixqr, A_Ixqi, A_Irootp,   &
-                     A_Linvr, A_Linvi, A_Iqr  , A_Iqi , A_Ipsmal,   &
-                     Ntotnn)
+                  CALL Setqri (calc, Ntotnn)
 !
 ! ***             Generate T = partial of cross sections with respect to R
 ! ***                      T = [ partial (sigma) wrt X ] * Q
-                  CALL Settri (Nentnn, Nextnn, N, Echan(:,N),   &
-                     Jfexcl(:,N), Zke(:,N), Zeta(:,N), Jfcros,A_Ixxxxr,   &
-                     A_Ixxxxi, A_Isinsq , A_Isinph, A_Icscs, A_Iqr,   &
-                     A_Iqi, A_Itr, A_Iti, A_Itx, Ntotnn)
+                  CALL Settri (spinInfo, calc, N)
                END IF
 !
                IF (Lrmat.EQ.0 .AND. needDeriv) THEN
 ! ***             Find derivatives of cross sections wrt res pars
-                  CALL Derres (calc, Nentnn, Jfexcl(:,N), Jfcros,   &
-                     Deriv(:,:,N), Derivx(:,:,:,:,N),   &
-                     A_Itr , A_Iti , A_Itx, I_Inotu, A_Iddddd, Dgoj,   &
-                     Ntotnn, Minr, Maxr)
+                  CALL Derres (spinInfo, calc, N,  iparStart)
                END IF
 !
-               IF (Lrmat.EQ.0 .AND. Ifcap) THEN
-! ***             Find derivatives of cs wrt universal capture width
-                  CALL Dercap (calc, Nentnn, Jfexcl(:,N), Jfcros,   &
-                     Deriv(:,:,N), Derivx(:,:,:,:,N),   &
-                     A_Itr , A_Iti , A_Itx , I_Inotu, A_Iddddd, Dgoj,   &
-                     Ntotnn, Minr, Maxr)
-               END IF
 !
-!
-               IF (Ifzzz.EQ.0) THEN
+               IF (calc%Ifzzz) THEN
 ! ***             Find derivatives of cross sections wrt Tzero & Elzero
 ! ***                (via energy-denominator portion of R-matrix)
-                  CALL Dereee (calc, Nentnn, Jfexcl(:,N), Jfcros,   &
-                     Derivx(:,:,:,:,N), A_Itr, A_Iti, A_Itx,   &
-                     Prer(:,N), Prei(:,N), A_Iddtlz, Ntotnn)
+                  CALL Dereee (spinInfo, calc, N)
                END IF
 !
-               IF (Npx.NE.0 .AND. Ifext.EQ.0) THEN
+               IF (calc%Ifext) THEN
+
 ! ***             Find deriv of cross sections with respect to R-ext pars
-                  CALL Derext (calc, Jfexcl(:,N), Jfcros,   &
-                     Deriv(:,:,N), Derivx(:,:,:,:,N), A_Itr, A_Itx,   &
-                     Dgoj, Ntotnn, Nentnn, Krext)
+                  CALL Derext (spinInfo, calc, N)
                END IF
 !
-               IF (Lrmat.EQ.0 .AND. (Ifzzz.EQ.0 .OR. Ifrad.EQ.0)) THEN
+               IF (Lrmat.EQ.0 .AND. (calc%Ifzzz .OR. calc%Ifrad )) THEN
 ! ***             Find derivatives of Xxxx wrt rho
-                  CALL Setpxr (A_Irootp, A_Ixxxxr, A_Ixxxxi,   &
-                     A_Idpdr, A_Idsdr, A_Ipxrr, A_Ipxri, Ntotnn)
+                  CALL Setpxr (calc,  Ntotnn)
                END IF
 !
-               Nnext = Nextnn
-               IF (Nnext.EQ.0) Nnext = 1
-               IF (Ifzzz.EQ.0 .OR. Ifrad.EQ.0) THEN
+               IF (calc%Ifzzz .OR. calc%Ifrad) THEN
 ! ***             Find derivatives of Crss & Crssx wrt rho
-                  CALL Derrho (spinInfo,  Jfcros,   &
-                     Zke(:,n), A_Isinsq, A_Isinph, A_Icscs, A_Idphi,   &
-                     A_Ixxxxr, A_Ixxxxi, A_Ipxrr, A_Ipxri, A_Idsf,   &
-                     A_Idst, A_Idstt, A_Idsfx, A_Idstx, Nnext,   &
-                     Lrmat)
+                  CALL Derrho (spinInfo, calc, N, Lrmat)
                END IF
 !
-               IF (Ifrad.EQ.0) THEN
+               IF (calc%Ifrad) THEN
 ! ***             Find Deriv of Crss & Crssx wrt radii
-                  CALL Derrad (Echan(:,N),   &
-                     Jfexcl(:,N), Jfcros, Zke(:,N),   &
-                     Deriv(:,:,N), Derivx(:,:,:,:,N),   &
-                     A_Idsf, A_Idst, A_Idstt, A_Idsfx, A_Idstx,   &
-                     Dgoj, Nnext, Lrmat, N)
+                  CALL Derrad (spinInfo, calc, N, Lrmat)
                END IF
 !
-               IF (Lrmat.EQ.0 .AND. Ifrad.EQ.0) THEN
+               IF (Lrmat.EQ.0 .AND. calc%Ifrad) THEN
 ! ***             Find rest of Deriv of Crss & Crssx wrt radii (the
 ! ***                part due to non-varied particle widths)
-                  CALL Derwid (Jfexcl(:,N), Jfcros,   &
-                     A_Ipgar, A_Ipgai, Deriv(:,:,N),   &
-                     Derivx(:,:,:,:,N), A_Itr, A_Iti, A_Itx,   &
-                     A_Iddddd, Dgoj, Ntotnn, Nentnn, Nfprrr)
+                  CALL Derwid (spinInfo, calc, N)
                END IF
 !
-               IF (Ifzzz.EQ.0) THEN
+               IF (calc%Ifzzz) THEN
 ! ***             Find deriv of Crss & Crssx wrt Tzero & Elzero (via rho
 !                      via Phi)
-                  CALL Dertze_Phi (Nentnn, Jfcros, Zke(:,N),A_Iddtlz,   &
-                     Derivx(:,:,:,:,N), A_Idsf, A_Idsfx, A_Idstx, N)
+                  CALL Dertze_Phi (spinInfo, calc, N)
                END IF
 !
-               IF (Lrmat.EQ.0 .AND. Ifzzz.EQ.0) THEN
+               IF (Lrmat.EQ.0 .AND. calc%Ifzzz) THEN
 ! ***             Find deriv of Crss & Crssx wrt Tzero & Elzero (via rho
 !                      via P & S)
-                  CALL Dertze (Nentnn, Nextnn, Jfexcl(:,N), Jfcros,   &
-                     Zke(:,N), A_Iddtlz, Derivx(:,:,:,:,N), A_Idst,   &
-                     A_Idstt, A_Idstx, Nnext, Ntotnn, N)
+                  CALL Dertze (spinInfo, calc, N)
                END IF
 !
-               IF (Ifzzz.EQ.0) THEN
+               IF (calc%Ifzzz) THEN
 ! ***             Find rest of Deriv Crss wrt Tzero * Elzero (Crss only,
 ! ***                not Crssx)
-                  CALL Derzzz (Crss(:,n), Deriv(:,:,N), A_Iddtlz, Dgoj)
+                  CALL Derzzz (spinInfo, calc, N)
                END IF
 !
-               IF (Ifiso.EQ.0) THEN
+               IF (calc%Ifiso) THEN
 ! ***             Find derivative of Crss wrt isotopic abundance
-                  IflAbund = spinInfo%getAbundanceFitFlag()
-                  CALL Deriso (IflAbund, Crss(:,N),Deriv(:,:,N),VarAbn)
+                  CALL Deriso (spinInfo, calc, N)
                END IF
 !
 
@@ -306,17 +187,24 @@ contains
          IF (Kadddc.NE.0) THEN
             DO Iiidrc=1,Nucdrc
                IF (Ndrcpt(Iiidrc).EQ.N) THEN
-                  IF (Xdrcpt(Iiidrc).NE.Zero) THEN
+                  IF (Xdrcpt(Iiidrc).NE.0.0d0) THEN
                      DO Ijk=1,Nummsc    ! only consider direct capture
                         if (Nammsc(IJK).NE.'DRCAP') cycle
                         IF (Jjkmsc(Ijk).EQ.0) THEN
                            GO TO 10
-                        ELSE IF (Jjkmsc(Ijk).EQ.Iiidrc) THEN
-                           Crss(2:Ncrsss,N) = Crss(2:Ncrsss,N) +    &
-                              Xdrcpt(Iiidrc)*Parmsc(Ijk)
-                           IF (Ks_Res.NE.2 .AND. Jflmsc(Ijk).GT.0) THEN
+                        ELSE IF (Jjkmsc(Ijk).EQ.Iiidrc) THEN                         
+                           val = Xdrcpt(Iiidrc)*Parmsc(Ijk)
+                           do j = 2, calc%Ntotc+1
+                             calc%crossInternal(j, N, 0) = calc%crossInternal(j, N, 0) + val
+                           end do
+                           IF (Jflmsc(Ijk).GT.0) THEN
                               Ipar = Jflmsc(Ijk)
-                              Deriv(2:Ncrsss,Ipar,N) = Xdrcpt(Iiidrc)
+                              val = Xdrcpt(Iiidrc)
+                              if (val.ne.0.0d0) then
+                                 do j = 2, calc%Ntotc+1
+                                   calc%crossInternal(j, N, Ipar) = calc%crossInternal(j, N, Ipar) + val
+                                 end do
+                              end if
                               GO TO 10
                            END IF
                         END IF
@@ -329,7 +217,7 @@ contains
          END IF
    10    CONTINUE
 !
-         Kstart = Kstart + Npr
+         iparStart = iparStart + calc%inumSize
       END DO
 !
       RETURN
@@ -338,102 +226,4 @@ contains
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Which_Derivs ()
-      use fixedi_m
-      use ifwrit_m
-      use EndfData_common_m
-      use ifsubs_common
-      use SammySpinGroupInfo_M   
-      implicit none
-      integer::n, ifgam
-      type(SammySpinGroupInfo)::spinInfo
-      type(SammyIsoInfo)::isoInfo
-      integer::ig,ich,ii,is
-!
-! *** Purpose -- Set flags = 0 if (maybe) calculate derivatives
-! ***                      = 1 if do not calculate derivatives
-!
-!     Need combined capture width derivatives if any gamma width is a
-!     combined gamma width
-!
-      Ifzzz = 1
-      IF (Itzero.GT.0) THEN
-         IF (Ksolve.EQ.2 .AND.    &
-            covData%isPupedParameter(Itzero)) THEN
-            Ifzzz = 0
-         ELSE IF (Ksolve.NE.2) THEN
-            Ifzzz = 0
-         END IF
-      END IF
-      IF (Ifzzz.EQ.1) THEN
-         IF (Ilzero.GT.0) THEN
-            IF (Ksolve.EQ.2 .AND.    &
-               covData%isPupedParameter(Ilzero)) THEN
-               Ifzzz = 0
-            ELSE IF (Ksolve.NE.2) THEN
-               Ifzzz = 0
-            END IF
-         END IF
-      END IF
-!
-      IF (Ksolve.EQ.2 .AND. Nfpext.NE.Nvpext) THEN
-         Ifext = 0
-      ELSE IF (Ksolve.NE.2 .AND. Nfpext.NE.0) THEN
-         Ifext = 0
-      ELSE
-         Ifext = 1
-      END IF
-!
-      Ifrad = 1
-      Ifradt = 1
-      DO ig=1,resparData%getNumSpinGroups()
-         call resParData%getSpinGroupInfo(spinInfo, ig)
-         DO Ich=1,spinInfo%getNumChannels()
-            ii = radFitFlags%getTrueFitFlag(Ig, Ich)
-            if (ii.gt.0) then
-               if( Ksolve.NE.2) then
-                   Ifrad = 0
-                   Ifradt = 0
-               else
-                  if (covData%isPupedParameter(ii)) then
-                    Ifrad = 0
-                    Ifradt = 0
-                  end if
-               end if
-            END IF
-            ii = radFitFlags%getEffFitFlag(Ig, Ich)
-            if (ii.gt.0) then
-               if( Ksolve.NE.2) then
-                   Ifrad = 0
-               else
-                  if (covData%isPupedParameter(ii)) then
-                    Ifrad = 0
-                  end if
-               end if
-            END if
-            if (Ifrad.eq.0.and.Ifradt.eq.0) exit
-         END DO
-         if (Ifrad.eq.0.and.Ifradt.eq.0) exit
-      END DO
-!
-      Ifiso = 1
-      if (Ncrssx.NE.0) then
-        do is = 1, resParData%getNumIso()
-           call resParData%getIsoInfo(isoInfo, Is)
-           ii = isoInfo%getFitOption()
-           if (ii.gt.0) then
-               if (Ksolve.ne.2) then
-                  Ifiso = 0
-               else
-                  if(covData%isPupedParameter(ii))then
-                    Ifiso = 0
-                  end if
-               end if
-           end if
-           if (Ifiso.eq.0) exit
-        end do
-      end if
-!
-      RETURN
-      END
 end module mxct06_m
diff --git a/sammy/src/xct/mxct07.f90 b/sammy/src/xct/mxct07.f90
index c7e80bdf8..1e23b5932 100644
--- a/sammy/src/xct/mxct07.f90
+++ b/sammy/src/xct/mxct07.f90
@@ -1,15 +1,12 @@
 !
 module xct7_m
   use XctCrossCalc_M
+  IMPLICIT None
   contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Setr (calc, Nent, Ntot, Igr, Bound, Echan, &
-        Sinsqr, Sin2ph, Dphi, Cscs, Sinphi, &
-        Cosphi, Zke, Zeta, Dpdr, Dsdr, Rmat, &
-        Ymat, Rootp, Elinvr, Elinvi, Psmall, Krext, Lrmat, Min, Max, &
-        Ipoten)
+      SUBROUTINE Setr (calc, spinInfo, Igr, Lrmat, Min, Ipoten)
 !
 ! *** PURPOSE -- Generate Linv = 1/(S-B+IP)
 ! ***                    Rootp = sqrt(P)
@@ -17,30 +14,17 @@ module xct7_m
 ! ***                     Ymat = Linv - Rmat
 ! ***            Also return Lrmat = 1 if no R-matrix contribution
 !
-      use sammy_CoulombSelector_I
       use sammy_LogarithmicDerivativeCWF_M
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use broad_common_m
-      use varyr_common_m
-      use EndfData_common_m
       use SammyResonanceInfo_M
+      use SammySpinGroupInfo_M
       use RMatResonanceParam_M
-
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
+      type(SammySpinGroupInfo)::spinInfo
       class(XctCrossCalc)::calc
-      DIMENSION Bound(*), Echan(*), &
-         Sinsqr(*), Sin2ph(*), Dphi(*), Cscs(2,*), Zke(*), &
-         Zeta(*), Dpdr(*), &
-         Dsdr(*), Rmat(2,*), Ymat(2,*), Rootp(*), Elinvr(*), &
-         Elinvi(*), Psmall(*)
-      DIMENSION Sinphi(*), Cosphi(*)
+      integer::igr, Ipoten, Lrmat, Min
       LOGICAL ABOVE_THRESHOLD
       type(SammyResonanceInfo)::resInfo
       type(RMatResonance)::resonance
-      type(SammySpinGroupInfo)::spinInfo
       type(SammyChannelInfo)::channelInfo
       type(RMatChannelParams)::channel
       type(SammyParticlePairInfo)::pairInfo
@@ -52,16 +36,13 @@ module xct7_m
       type(RExternalFunction)::rext
       real(kind=8)::Parext(7)
       double precision, parameter :: Big = 1.0E30
-!
-!      DIMENSION Bound(Ntotc),
-!     *   Echan(Ntotc),
-!     *   Zke(Ntotc), Zeta(Ntotc),
-!     *   Dpdr(Ntotc), Dsdr(Ntotc), Rmat(2,Ntriag),
-!     *   Ymat(2,Ntriag), Rootp(Ntotc), Elinvr(Ntotc), Elinvi(Ntotc),
-!     *   Psmall(Ntotc)
-!
-      DATA Zero /0.0d0/, One /1.0d0/, Two /2.0d0/, &
-           Tiny /1.d-8/, Teeny /1.d-20/
+
+      real(kind=8),parameter:: Zero = 0.0d0, One = 1.0d0, Two = 2.0d0, &
+           Tiny =1.d-8, Teeny = 1.d-20
+      integer::Nent, Ntot, I, Ichan, Iffy, Ires, Ishift, J, Ji, K, Kk, Kkx
+      integer::Kl, Kx, L, Lsp, Ii, Nrext
+      real(kind=8)::Aloge, beta, channelWidthC, channelWidthCPrime, Dp, Ds, Eta
+      real(kind=8)::Hi, Hr, P, Q, Rho, Rhof, S, Su
 !
 !     NNNTOT not used anywhere       
 !
@@ -71,14 +52,18 @@ module xct7_m
 ! *** Initialize Rmat = R-Matrix
 !
       Aloge = Zero
+      Su = dAbs(calc%ener)
       KL = 0
+      Nent = spinInfo%getNumEntryChannels()
+      Ntot = spinInfo%getNumChannels()
       DO K=1,Ntot
-         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()
+         hasRext = calc%resData%hasRexInfo(Igr, K)
+         Parext = 0.0d0        
+         IF (hasRext) then           
+           call calc%resData%getRextInfoByGroup(rextInfo, Igr, K)
+           Nrext = rextInfo%getNrext()
+           call calc%resData%getRext(rext, rextInfo)
+           DO J = 1, Nrext
              Parext(J) = rext%getSammyValue(J)
            end do
            Aloge &
@@ -86,14 +71,14 @@ module xct7_m
          end if
          DO L=1,K
             KL = KL + 1
-            Rmat(1,KL) = Zero
-            Rmat(2,KL) = Zero
+            calc%Rmat(1,KL) = Zero
+            calc%Rmat(2,KL) = Zero
             IF (L.EQ.K .AND. hasRext) &
                THEN
-               Rmat(1,KL) =   Parext(3) &
+               calc%Rmat(1,KL) =   Parext(3) &
                             + Parext(4)*Su &
                             - Parext(5)*Aloge
-               IF (Nrext.EQ.7) Rmat(1,KL) = Rmat(1,KL) &
+               IF (Nrext.EQ.7) calc%Rmat(1,KL) = calc%Rmat(1,KL) &
                   + Parext(7)*Su**2 - Parext(6)* &
                         (  Parext(2) - Parext(1)  ) &
                   - Parext(6)*Aloge*Su
@@ -101,22 +86,22 @@ module xct7_m
          END DO
       END DO
 !
-      call resParData%getSpinGroupInfo(spinInfo, igr)
+      call calc%resData%getSpinGroupInfo(spinInfo, igr)
 
-      IF (Max.GE.Min .AND. Min.GT.0) THEN
-         DO Ires=Min,Max
-            call resParData%getResonanceInfo(resInfo, Ires)
-            call resParData%getRedResonance(resonance, resInfo)
+         DO Ires=Min,calc%resData%getNumResonances()
+            call calc%resData%getResonanceInfo(resInfo, Ires)
+            if( resInfo%getSpinGroupIndex().ne.igr) exit
+            call calc%resData%getRedResonance(resonance, resInfo)
             KL = 0
             DO K=1,Ntot
                ichan = spinInfo%getWidthForChannel(k)
                channelWidthC = resonance%getWidth(ichan)
                call spinInfo%getChannelInfo(channelInfo, K)
-               call resParData%getChannel(channel, channelInfo)
-               call resParData%getParticlePairInfo( &
+               call calc%resData%getChannel(channel, channelInfo)
+               call calc%resData%getParticlePairInfo( &
                       pairInfo, &
                       channelInfo%getParticlePairIndex())
-              call resParData%getParticlePair(pair, pairInfo)
+              call calc%resData%getParticlePair(pair, pairInfo)
               if (pair%getCalcShift()) then
                  Ishift = 1
               else
@@ -131,32 +116,31 @@ module xct7_m
                   ! Check on Beta is unnecessary, as we would just add zero - who cares
                   ! Use K to track whether we add closed channel contribution based on value of Ishift
                   IF( Ishift == 0 ) THEN ! B=S
-                    IF ( Su.GT.Echan(K) .AND. Su.GT.Echan(L) ) THEN
-                      Rmat(1,KL) = Rmat(1,KL)+calc%Alphar(Ires)*Beta
+                    IF ( Su.GT.calc%Echan(K, Igr) .AND. Su.GT.calc%Echan(L, Igr) ) THEN
+                      calc%Rmat(1,KL) = calc%Rmat(1,KL)+calc%Alphar(Ires)*Beta
                       IF (calc%needAlphai(Ires)) THEN
-                         Rmat(2,KL) = Rmat(2,KL) + &
+                         calc%Rmat(2,KL) = calc%Rmat(2,KL) + &
                             calc%Alphai(Ires)*Beta
                       END IF   
                     END IF
                   ELSE ! B =/= S 
-                    Rmat(1,KL) = Rmat(1,KL) + calc%Alphar(Ires)*Beta
+                    calc%Rmat(1,KL) = calc%Rmat(1,KL) + calc%Alphar(Ires)*Beta
                     IF (calc%needAlphai(Ires)) THEN
-                       Rmat(2,KL) = Rmat(2,KL) + &
+                       calc%Rmat(2,KL) = calc%Rmat(2,KL) + &
                           calc%Alphai(Ires)*Beta
                     END IF
                   END IF
                END DO
             END DO
          END DO
-      END IF
 !
 ! *** Check if Rmat is Zero; if so, set Lrmat=1
       KL = 0
       DO K=1,Ntot
          DO L=1,K
             KL = KL + 1
-            IF (Rmat(1,KL).NE.Zero) GO TO 20
-            IF (Rmat(2,KL).NE.Zero) GO TO 20
+            IF (calc%Rmat(1,KL).NE.Zero) GO TO 20
+            IF (calc%Rmat(2,KL).NE.Zero) GO TO 20
          END DO
       END DO
       Lrmat = 1
@@ -174,44 +158,46 @@ module xct7_m
       DO K=1,Ntot
          DO L=1,K
             KL = KL + 1
-            Ymat(1,KL) = - Rmat(1,KL)
-            Ymat(2,KL) = - Rmat(2,KL)
+            calc%Ymat(1,KL) = - calc%Rmat(1,KL)
+            calc%Ymat(2,KL) = - calc%Rmat(2,KL)
          END DO
       END DO
 !
-      CALL Zero_Array (Psmall, Ntot)
+      calc%Psmall = Zero
+      if (calc%Ifzzz .OR. calc%Ifrad) then
+         calc%Dpdr = Zero
+         calc%Dsdr = Zero
+      end if
 !
       II = 0
       DO I=1,Ntot
          call spinInfo%getChannelInfo(channelInfo, I)
-         call resParData%getChannel(channel, channelInfo)
-         call resParData%getParticlePairInfo( &
+         call calc%resData%getChannel(channel, channelInfo)
+         call calc%resData%getParticlePairInfo( &
                       pairInfo, &
                       channelInfo%getParticlePairIndex())
-         call resParData%getParticlePair(pair, pairInfo)
+         call calc%resData%getParticlePair(pair, pairInfo)
 
          II = II + I
-         Rootp (I) =  Zero ! new default to cancel out closed channels
-         Elinvr(I) =  Zero
-         Elinvi(I) =  Zero ! new default to cancel out closed channels
-         Dpdr(I) = Zero
-         Dsdr(I) = Zero
+         calc%Rootp (I) =  Zero ! new default to cancel out closed channels
+         calc%Elinvr(I) =  Zero
+         calc%Elinvi(I) =  Zero ! new default to cancel out closed channels
          ! IFFY is used to report when L is not invertible, i.e. L = S - B + iP = 0
          Iffy = 0
 
         ! are we above the threshold for this channel?        
          ABOVE_THRESHOLD = .FALSE.
-         if( (Su - Echan(I) ) .GT. Zero ) ABOVE_THRESHOLD = .TRUE.
+         if( (Su - calc%Echan(I, Igr) ) .GT. Zero ) ABOVE_THRESHOLD = .TRUE.
          
          Lsp = channel%getL()
          Q   = Zero ! effective incoming energy
          IF ( ABOVE_THRESHOLD )  THEN ! effective incoming energy is above channel threshold
-             Q = dSQRT( Su - Echan(I) )
+             Q = dSQRT( Su - calc%Echan(I, Igr) )
          ELSE ! effective incoming energy is below channel threshold
-             Q = dSQRT( dABS( Su - Echan(I) ) )
+             Q = dSQRT( dABS( Su - calc%Echan(I, Igr) ) )
          ENDIF
-         Rho  = channel%getApt()*Zke( I ) * Q ! "true" rho (effective incident neutron energy with "true" channel radius)
-         Rhof = channel%getApe()*Zke( I ) * Q ! "effective" rho (effective incident neutron energy with "effective" channel radius)
+         Rho  = channel%getApt()*calc%Zke(I, Igr) * Q ! "true" rho (effective incident neutron energy with "true" channel radius)
+         Rhof = channel%getApe()*calc%Zke(I, Igr) * Q ! "effective" rho (effective incident neutron energy with "effective" channel radius)
          
          Eta = Zero
          IF( Q .EQ. Zero ) THEN ! bomb out to prevent division by zero 
@@ -220,7 +206,7 @@ module xct7_m
                     F10.5, ' effective energy was exactly zero:', F10.5)
             RETURN
          ENDIF
-         IF( Zeta( I ) /= Zero ) Eta = Zeta( I ) / Q ! effective Eta
+         IF( calc%Zeta(I, Igr) /= Zero ) Eta = calc%Zeta(I, Igr) / Q ! effective Eta
          
          ! set CWF solver parameters
          call cwf_solver%setRealPartRho( Rho )
@@ -273,9 +259,9 @@ module xct7_m
          Hi = Zero         
          IF( Ishift /= 0 ) THEN
             ! we set the denominator first, then divide by it later
-            Hr = ( S - Bound( I ) )**2 + P**2
+            Hr = ( S - calc%Bound(I, Igr) )**2 + P**2
             Hi = -P / Hr
-            Hr = ( S - Bound( I ) ) / Hr
+            Hr = ( S - calc%Bound(I, Igr ) ) / Hr
          ELSE
             ! TODO: Maybe introduce cutoff on P? P < SMALL or something
             ! otherwise - should be impossible to get exactly P = 0.0 with Ishift = 0
@@ -287,9 +273,9 @@ module xct7_m
          ENDIF
          
          ! compute phase shift and derivative if necessary
-         Dphi( I )   = Zero
-         Sinphi( I ) = Zero
-         Cosphi( I ) = One
+         calc%Dphi( I )   = Zero
+         calc%Sinphi( I ) = Zero
+         calc%Cosphi( I ) = One
          IF( ABOVE_THRESHOLD ) THEN
              IF( Rho /= Rhof ) THEN
                  ! TODO: Bug in old SAMMY implementation, uses wrong Rho for charged particles phase shifts...
@@ -298,23 +284,23 @@ module xct7_m
                    call cwf_solver%setRealPartRho( Rhof )
                  ENDIF
              ENDIF
-             Dphi( I )   = cwf_solver%getPhaseShiftDerivative()
-             Sinphi( I ) = cwf_solver%getSinPhaseShift()
-             Cosphi( I ) = cwf_solver%getCosPhaseShift()
+             calc%Dphi( I )   = cwf_solver%getPhaseShiftDerivative()
+             calc%Sinphi( I ) = cwf_solver%getSinPhaseShift()
+             calc%Cosphi( I ) = cwf_solver%getCosPhaseShift()
          ENDIF
-         Sinsqr(I) = Sinphi( I )**2                   ! sin^2( phase shift )
-         Sin2ph(I) = Two * Sinphi( I ) * Cosphi( I )  ! sin( 2 * phase shift )  
+         calc%Sinsqr(I) = calc%Sinphi( I )**2                        ! sin^2( phase shift )
+         calc%Sin2ph(I) = Two * calc%Sinphi( I ) * calc%Cosphi( I )  ! sin( 2 * phase shift )
          
-         IF (Ifdif.NE.0) THEN
+         IF (calc%needAngular) THEN
           Kk = (I*(I-1))/2
 
           IF (I.GT.1) THEN
            DO Kx=1,I-1
             Kkx = Kk + Kx
-            Cscs(1,Kkx) = Cosphi(Kx)*Cosphi(I) -  &
-                          Sinphi(Kx)*Sinphi(I)
-            Cscs(2,Kkx) = Cosphi(Kx)*Sinphi(I) + &
-                          Sinphi(Kx)*Cosphi(I)
+            calc%Cscs(1,Kkx) = calc%Cosphi(Kx)*calc%Cosphi(I) - &
+                               calc%Sinphi(Kx)*calc%Sinphi(I)
+            calc%Cscs(2,Kkx) = calc%Cosphi(Kx)*calc%Sinphi(I) + &
+                               calc%Sinphi(Kx)*calc%Cosphi(I)
            END DO
           ENDIF
          ENDIF
@@ -345,53 +331,57 @@ module xct7_m
          !     ii) P was less than "Tiny"
          ! By removing that giant block, we are assuming that cases 1, 2.a, 2.b.i, and 2.b.ii never happen
          
-         Rootp(I) = dSQRT( P )
-         Dpdr(I)  = Dp
-         Dsdr(I)  = Ds
+         calc%Rootp(I) = dSQRT( P )
+         if (calc%Ifzzz .OR. calc%Ifrad) then
+            calc%Dpdr(I)  = Dp
+            calc%Dsdr(I)  = Ds
+         end if
 
          IF (Iffy.EQ.0 .AND. .NOT. (Ishift.EQ.0 .AND. &
-                  (One-P*Rmat(2,Ii).EQ.One .OR. P.LT.Tiny))) THEN
-            Elinvr(I) = Hr
-            Elinvi(I) = Hi
-            Ymat(1,Ii) = Hr + Ymat(1,Ii)
-            Ymat(2,Ii) = Hi + Ymat(2,Ii)
+                  (One-P*calc%Rmat(2,Ii).EQ.One .OR. P.LT.Tiny))) THEN
+            calc%Elinvr(I) = Hr
+            calc%Elinvi(I) = Hi
+            calc%Ymat(1,Ii) = Hr + calc%Ymat(1,Ii)
+            calc%Ymat(2,Ii) = Hi + calc%Ymat(2,Ii)
          ELSE
 ! ***             Here penetrability is very small but non-Zero
 ! ***             However, if too small to compute, set Psmall = -1.0
-            IF (Rootp(I).LT.Teeny) THEN
-               Psmall(I) = -One
+            IF (calc%Rootp(I).LT.Teeny) THEN
+               calc%Psmall(I) = -One
             ELSE
-               Psmall(I) = Rootp(I)
+               calc%Psmall(I) = calc%Rootp(I)
             END IF
-            Ymat(1,Ii) = P*Ymat(1,Ii)
-            Ymat(2,Ii) = P*Ymat(2,Ii) - One
-            Rmat(1,Ii) = P*Rmat(1,Ii)
-            Rmat(2,Ii) = P*Rmat(2,Ii)
+            calc%Ymat(1,Ii) = P*calc%Ymat(1,Ii)
+            calc%Ymat(2,Ii) = P*calc%Ymat(2,Ii) - One
+            calc%Rmat(1,Ii) = P*calc%Rmat(1,Ii)
+            calc%Rmat(2,Ii) = P*calc%Rmat(2,Ii)
             IF (Ntot.GT.1) THEN
                IF (I.GT.1) THEN
                   DO J=1,I-1
                      Ji = (I*(I-1))/2 + J
-                     Ymat(1,Ji) = Rootp(I)*Ymat(1,Ji)
-                     Ymat(2,Ji) = Rootp(I)*Ymat(2,Ji)
-                     Rmat(1,Ji) = Rootp(I)*Rmat(1,Ji)
-                     Rmat(2,Ji) = Rootp(I)*Rmat(2,Ji)
+                     calc%Ymat(1,Ji) = calc%Rootp(I)*calc%Ymat(1,Ji)
+                     calc%Ymat(2,Ji) = calc%Rootp(I)*calc%Ymat(2,Ji)
+                     calc%Rmat(1,Ji) = calc%Rootp(I)*calc%Rmat(1,Ji)
+                     calc%Rmat(2,Ji) = calc%Rootp(I)*calc%Rmat(2,Ji)
                   END DO
                END IF
                IF (I.LT.Ntot) THEN
                   DO J=I+1,Ntot
                      Ji = (J*(J-1))/2 + I
-                     Ymat(1,Ji) = Rootp(I)*Ymat(1,Ji)
-                     Ymat(2,Ji) = Rootp(I)*Ymat(2,Ji)
-                     Rmat(1,Ji) = Rootp(I)*Rmat(1,Ji)
-                     Rmat(2,Ji) = Rootp(I)*Rmat(2,Ji)
+                     calc%Ymat(1,Ji) = calc%Rootp(I)*calc%Ymat(1,Ji)
+                     calc%Ymat(2,Ji) = calc%Rootp(I)*calc%Ymat(2,Ji)
+                     calc%Rmat(1,Ji) = calc%Rootp(I)*calc%Rmat(1,Ji)
+                     calc%Rmat(2,Ji) = calc%Rootp(I)*calc%Rmat(2,Ji)
                   END DO
                END IF
             END IF
-            Rootp(I) = One
-            Elinvr(I) = Zero
-            Elinvi(I) = -One
-            Dpdr(I) = Zero
-            Dsdr(I) = Zero
+            calc%Rootp(I) = One
+            calc%Elinvr(I) = Zero
+            calc%Elinvi(I) = -One
+            if (calc%Ifzzz .OR. calc%Ifrad) then
+               calc%Dpdr(I) = Zero
+               calc%Dsdr(I) = Zero
+            end if
          END IF
          
       END DO    
@@ -401,8 +391,8 @@ module xct7_m
          KL = 0
          DO K=1,Ntot
             KL = KL + K
-            IF (Ymat(1,KL).EQ.Zero .AND. Ymat(2,KL).EQ.Zero) THEN
-               Ymat(1,KL) = One
+            IF (calc%Ymat(1,KL).EQ.Zero .AND. calc%Ymat(2,KL).EQ.Zero) THEN
+               calc%Ymat(1,KL) = One
             END IF
          END DO
       END IF
@@ -416,60 +406,65 @@ module xct7_m
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Re_Setr (Nent, Ntot, Sinsqr, Sin2ph, Dphi, Cscs, &
-         Sinphi, Cosphi, Dpdr, Dsdr, Rmat, Ymat, Rootp, Elinvr, Elinvi, &
-         If_Excl)
+      SUBROUTINE Re_Setr (calc, spinInfo, Igr)
 !
 ! *** Purpose -- Reset all necessary values to zero if some channels
 ! ***               are excluded
 !
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use broad_common_m
-      use varyr_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use SammySpinGroupInfo_M
+
 !
-      DIMENSION Sinsqr(*), Sin2ph(*), Dphi(*), Cscs(2,*), Dpdr(*), &
-         Dsdr(*), Rmat(2,*), Ymat(2,*), Rootp(*), Elinvr(*), &
-         Elinvi(*), Sinphi(*), Cosphi(*), If_Excl(*)
+      type(SammySpinGroupInfo)::spinInfo
+      class(XctCrossCalc)::calc
+      integer::igr
+      type(SammyChannelInfo)::channelInfo
+      integer::I, K, KL, L, Ntot
 !
 !
-      DATA Zero /0.0d0/, One /1.0d0/
+      real(kind=8),parameter::Zero=0.0d0, One=1.0d0
+      logical::hasExclude
 !
 !
+      hasExclude = .false.
+      ntot = spinInfo%getNumChannels()
       DO I=1,Ntot
-         IF (If_Excl(I).LT.0) THEN
-            Sinphi(I) = Zero
-            Cosphi(I) = Zero
-            Sinsqr(I) = Zero
-            Sin2ph(I) = Zero
-            Rootp (I) = Zero
-            Elinvr(I) = Zero
-            Elinvi(I) = Zero
-            Dphi  (I) = Zero
-            Dpdr  (I) = Zero
-            Dsdr  (I) = Zero
+         call spinInfo%getChannelInfo(channelInfo, I)
+         if (channelInfo%getExcludeCompletely()) then
+            hasExclude = .true.
+            calc%Sinphi(I) = Zero
+            calc%Cosphi(I) = Zero
+            calc%Sinsqr(I) = Zero
+            calc%Sin2ph(I) = Zero
+            calc%Rootp (I) = Zero
+            calc%Elinvr(I) = Zero
+            calc%Elinvi(I) = Zero
+            calc%Dphi(I) = Zero
+            if (calc%Ifzzz .OR. calc%Ifrad) then
+               calc%Dpdr  (I) = Zero
+               calc%Dsdr  (I) = Zero
+            end if
          END IF
       END DO
+      if (.not.hasExclude) return
 !
       KL = 0
       DO K=1,Ntot
-         DO L=1,K
+         call spinInfo%getChannelInfo(channelInfo, K)
+         hasExclude = channelInfo%getExcludeCompletely()
+         DO L=1,K          
             KL = KL + 1
-            IF (If_Excl(K).LT.0 .OR. If_Excl(L).LT.0) THEN
-               IF (Ifdif.NE.0) THEN
-                  Cscs(1,KL) = Zero
-                  Cscs(2,KL) = Zero
+            call spinInfo%getChannelInfo(channelInfo, l)
+            IF (hasExclude .OR.channelInfo%getExcludeCompletely()) THEN
+               IF (calc%needAngular) THEN
+                  calc%Cscs(:,KL) = Zero
                END IF
-               Rmat(1,KL) = Zero
-               Rmat(2,KL) = Zero
+               calc%Rmat(:,KL) = Zero
                IF (K.EQ.L) THEN
-                  Ymat(1,KL) = One
+                  calc%Ymat(1,KL) = One
                ELSE
-                  Ymat(1,KL) = Zero
+                  calc%Ymat(1,KL) = Zero
                END IF
-               Ymat(2,KL) = Zero
+               calc%Ymat(2,KL) = Zero
             END IF
          END DO
       END DO
diff --git a/sammy/src/xct/mxct08.f90 b/sammy/src/xct/mxct08.f90
index c3bc87aaa..acce85913 100755
--- a/sammy/src/xct/mxct08.f90
+++ b/sammy/src/xct/mxct08.f90
@@ -1,56 +1,54 @@
+module mxct08_m
+use XctCrossCalc_M
+IMPLICIT none
+
+
+private Yfour
+contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Zeror (Xxxxr, Xxxxi, Xqr, Xqi, Pxrhor, Pxrhoi, Ntot)
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Xxxxr(*), Xxxxi(*), Xqr(Ntot,*), Xqi(Ntot,*),   &
-           Pxrhor(*), Pxrhoi(*)
-      DATA Zero /0.0d0/
-      N = Ntot
-      JK = 0
-      DO J=1,N
-         DO K=1,J
-            JK = JK + 1
-            Xxxxr (JK) = Zero
-            Xxxxi (JK) = Zero
-            Pxrhor(JK) = Zero
-            Pxrhoi(JK) = Zero
-         END DO
-      END DO
-      DO J=1,N
-         DO K=1,N
-            Xqr(K,J) = Zero
-            Xqi(K,J) = Zero
-         END DO
-      END DO
+      SUBROUTINE Zeror (calc)
+      class(XctCrossCalc)::calc
+
+      calc%Xxxxi = 0.0d0
+      calc%Xxxxr = 0.0d0
+      calc%Xqr   = 0.0d0
+      calc%Xqi   = 0.0d0
+
+      IF (calc%Ifzzz .OR. calc%Ifrad) THEN
+        calc%Pxrhor = 0.0d0
+        calc%Pxrhoi = 0.0d0
+      end if
+
       RETURN
       END
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Yinvrs (Ymat, Yinv, Dummy, Ntot)
+      SUBROUTINE Yinvrs (calc, Ntot)
 !
 ! *** PURPOSE -- Invert Ymat to give Yinv
 !
-      DOUBLE PRECISION Ymat, Yinv, Dummy
-      DIMENSION Ymat(2,*), Yinv(2,*), Dummy(*)
+      integer::ntot
+      class(XctCrossCalc)::calc
 !
       IF (Ntot.EQ.1) THEN
 ! ***    ONE CHANNEL -- (INVERSE OF Ymat) = Yinv
-         CALL Onech (Ymat, Yinv)
+         CALL Onech (calc%Ymat, calc%Yinv)
 !
       ELSE IF (Ntot.EQ.2) THEN
 ! ***    TWO CHANNELS -- (INVERSE OF Ymat) = Yinv
-         CALL Twoch (Ymat, Yinv)
+         CALL Twoch (calc%Ymat, calc%Yinv)
 !
       ELSE IF (Ntot.EQ.3) THEN
 ! ***    THREE CHANNELS -- (INVERSE OF Ymat) = Yinv
-         CALL Three (Ymat, Yinv)
+         CALL Three (calc%Ymat, calc%Yinv)
 !
       ELSE
 ! ***    INVERT Ymat TO GIVE Yinv FOR MORE THAN Three CHANNELS
-         CALL Yfour (Ymat, Yinv, Dummy, Ntot)
+         CALL Yfour (calc%Ymat, calc%Yinv, calc%Xqr, Ntot)
 !
       END IF
       RETURN
@@ -60,32 +58,29 @@
 ! --------------------------------------------------------------
 !
       SUBROUTINE Yfour (Ymat, Yinv, Dummy, Ntot)
-!
-! *** PURPOSE -- calculate Ymat**-1, for any number of channels.
-!
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Ymat(2,*), Yinv(2,*), Dummy(2,*), III(100)
-      DATA Zero /0.0d0/, One /1.0d0/
-      DATA Maxaa /100/
-!
+      use Xspfa_Xspsl_m
+      real(kind=8)::Ymat(:,:), Yinv(:,:), Dummy(:,:)
+      integer::III(100)
+      integer::Ntot
+      real(kind=8),parameter::Zero = 0.0d0, One=1.0d0
+      integer,parameter::Maxaa=100
+      integer::Kj, J, K, Info
+
       IF (Ntot.GT.Maxaa) STOP '[STOP in Yfour in xct/mxct08.f]'
-!
+
       CALL Xspfa (Ymat, Ntot, Iii, Info)
       IF (Info.NE.0) WRITE (6,99998) Info
 99998 FORMAT (' Problem in Xspfa with Info=', I5)
       Kj = 0
       DO K=1,Ntot
-         DO J=1,Ntot
-            Dummy(1,J) = Zero
-            Dummy(2,J) = Zero
-         END DO
+         Dummy(1:2,:) = Zero
          Dummy(1,K) = One
-         CALL Xspsl (Ymat, Ntot, Iii, Dummy)
+         CALL Xspsl (Ymat, Ntot, Iii, Dummy(1:2,:))
          DO J=1,K
             Kj = Kj + 1
             Yinv(1,KJ) = Dummy(1,J)
             Yinv(2,KJ) = Dummy(2,J)
          END DO
       END DO
-      RETURN
       END
+end module mxct08_m
diff --git a/sammy/src/xct/mxct09.f90 b/sammy/src/xct/mxct09.f90
index b070dc007..9111626bd 100644
--- a/sammy/src/xct/mxct09.f90
+++ b/sammy/src/xct/mxct09.f90
@@ -1,9 +1,12 @@
+module mxct09_m
+use XctCrossCalc_M
+IMPLICIT  None
+contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Setxqx (Ntot, Yinv, Rmat, Xqr, Xqi, Rootp, Elinvr,   &
-         Elinvi, Xxxxr, Xxxxi)
+      SUBROUTINE Setxqx (calc, Ntot)
 !
 ! *** Purpose -- Form XQ & XXXX matrices, where
 ! ***            XQ   = Yinv * Rmat       and
@@ -17,20 +20,15 @@
 !
 ! ***         ie W    = I + 2i XXXX
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
-      DIMENSION Yinv(2,*), Rmat(2,*), Xqr(Ntot,*), Xqi(Ntot,*),   &
-         Rootp(*), Elinvr(*), Elinvi(*), Xxxxr(*), Xxxxi(*)
-!      DIMENSION Yinv(2,Nnnn), Rmat(2,Nnnn), Xqr(Ntot,Ntot),
-!     *   Xqi(Ntot,Ntot), Rootp(Ntotc), Elinvr(Ntot), Elinvi(Ntot),
-!     *   Xxxxr(Nnnn), Xxxxi(Nnnn)
-      EXTERNAL Ijkl
+      class(XctCrossCalc)::calc
+      integer::ntot
+      integer::I, Ij, Jk, K, J
+      real(kind=8)::Pli, Plr
+
 !
-      CALL Zero_Array (Xqr, Ntot*Ntot)
-      CALL Zero_Array (Xqi, Ntot*Ntot)
+      calc%Xqr = 0.0d0
+      calc%Xqi = 0.0d0
 !
 ! *** Xqr(k,i) = (L**-1-R)**-1 * R ... note asymmetry
       DO I=1,Ntot
@@ -38,10 +36,10 @@
             Ij = Ijkl(J,I)
             DO K=1,Ntot
                Jk = Ijkl(K,J)
-               Xqr(K,I) = Xqr(K,I) + Yinv(1,Ij)*Rmat(1,Jk) -   &
-                                     Yinv(2,Ij)*Rmat(2,Jk)
-               Xqi(K,I) = Xqi(K,I) + Yinv(1,Ij)*Rmat(2,Jk) +   &
-                                     Yinv(2,Ij)*Rmat(1,Jk)
+               calc%Xqr(K,I) = calc%Xqr(K,I) + calc%Yinv(1,Ij)*calc%Rmat(1,Jk) -   &
+                                     calc%Yinv(2,Ij)*calc%Rmat(2,Jk)
+               calc%Xqi(K,I) = calc%Xqi(K,I) + calc%Yinv(1,Ij)*calc%Rmat(2,Jk) +   &
+                                     calc%Yinv(2,Ij)*calc%Rmat(1,Jk)
             END DO
          END DO
       END DO
@@ -49,12 +47,12 @@
 ! *** Xxxx = sqrt(P)/L  * xq * sqrt(P) ... symmetric
       IJ = 0
       DO I=1,Ntot
-         Plr = Rootp(I)*Elinvr(I)
-         Pli = Rootp(I)*Elinvi(I)
+         Plr = calc%Rootp(I)*calc%Elinvr(I)
+         Pli = calc%Rootp(I)*calc%Elinvi(I)
          DO J=1,I
             Ij = Ij + 1
-            Xxxxr(Ij) = Rootp(J)* (Xqr(J,I)*Plr-Xqi(J,I)*Pli)
-            Xxxxi(Ij) = Rootp(J)* (Xqi(J,I)*Plr+Xqr(J,I)*Pli)
+            calc%Xxxxr(Ij) = calc%Rootp(J)* (calc%Xqr(J,I)*Plr-calc%Xqi(J,I)*Pli)
+            calc%Xxxxi(Ij) = calc%Rootp(J)* (calc%Xqi(J,I)*Plr+calc%Xqr(J,I)*Pli)
          END DO
       END DO
       RETURN
@@ -63,128 +61,133 @@
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Sectio (Nent, Next, igr, Echan, If_Excl, Ifcros, Zke,   &
-         Zeta, Xxxxr, Xxxxi, Sinsqr, Sin2ph, Termf, Crss, Crssx, Cscs,   &
-         Dgoj, Ntotnn)
+      SUBROUTINE Sectio (spinInfo, calc, igr)
 !
 ! *** Purpose -- Generate pieces of cross sections (except for "4 pi / E")
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      use EndfData_common_m
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
-      use mxct26_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct26_m      
 !
+      class(XctCrossCalc)::calc
       type(SammySpinGroupInfo)::spinInfo
       type(SammyChannelInfo)::channelInfo
       type(RMatChannelParams)::channel
-      DIMENSION Echan(*), If_Excl(*), Ifcros(*), Zke(*),   &
-         Zeta(*), Xxxxr(*), Xxxxi(*),Sinsqr(*), Sin2ph(*), Termf(*),   &
-         Crss(Ncrsss), Crssx(2,Ntotc,Ntotc,*), Cscs(2,*)
-      DATA Zero /0.0d0/, One /1.0d0/, Two /2.0d0/
-!
-!
-!
-      IF (Ifcros(1).EQ.1) THEN
+      real(kind=8),parameter:: Zero = 0.0d0, One = 1.0d0, Two = 2.0d0
+      integer::Nent, Next, igr, Ntotnn
+      real(kind=8)::Dgoj
+      real(kind=8)::val, Su
+      real(kind=8)::Ai, Ar, Bi, Br, Ci, Cr, Di, Dr
+      real(kind=8)::Terma, Termn, Zz
+      logical::Ifs
+      integer::I, Ichan, Ichanx,  Ii, Ij, J, Jj, Lspin, Lspinx
+!
+!
+!
+      Su = dAbs(calc%ener)
+      Nent = spinInfo%getNumEntryChannels()
+      Next = spinInfo%getNumExitChannels()
+      Ntotnn = spinInfo%getNumChannels()
+      Dgoj = spinInfo%getGFactor()
+      IF (calc%Ifcros(1)) THEN
 ! ***    elastic  Crss(1) = g*0.25* sum(entrance chs c,c')
 ! ***                                     times |(1-U(c,c'))| **2 / Zz
 ! ***                     = g* [ sin(phi)**2 * (1-2Xxxxi)
 ! ***                            - sin(2phi)*Xxxxr
 ! ***                            + (Xxxxr**2 + Xxxxi**2) ] / Zz
-         Crss(1) = Zero
+         val = Zero
          Ii = 0
          Ij = 0
          DO I=1,Nent
-            Zz = Zke(I)**2
+            Zz = calc%Zke(I, Igr)**2
             Ii = Ii + I
-            Termn = Sinsqr(I)*( One - Two * Xxxxi(Ii) )   &
-                          - Sin2ph(I)*Xxxxr(Ii)
+            Termn = calc%Sinsqr(I)*( One - Two *calc%Xxxxi(Ii) )   &
+                          - calc%Sin2ph(I)*calc%Xxxxr(Ii)
             Termn = Termn / Zz
             DO J=1,I
                Ij = Ij + 1
-               Ar = ( Xxxxr(Ij)**2 + Xxxxi(Ij)**2 )/Zz
+               Ar = ( calc%Xxxxr(Ij)**2 + calc%Xxxxi(Ij)**2 )/Zz
                IF (I.NE.J) Ar = Ar + Ar
                Termn = Termn + Ar
             END DO
-            Crss(1) = Termn + Crss(1)
+            val = Termn + val
          END DO
-         Crss(1) = Crss(1)*Dgoj
+         val = val * Dgoj + calc%crossInternal(1, igr, 0)
+         calc%crossInternal(1, igr, 0) = val
       END IF
 !
-      IF (Ifcros(2).EQ.1) THEN
+      IF (calc%Ifcros(2)) THEN
 ! ***    absorption = g*0.25 * sum(inc c)
 ! ***                  [ 1 -  sum(inc c') |U(c,c')| **2 ] / Zz
 ! ***               = - g* (Xxxxr**2 + Xxxxi**2) / Zz
-         Crss(2) = Zero
+         val = Zero
          Ii = 0
          Ij = 0
          DO I=1,Nent
             Ii = Ii + I
-            Zz = Zke(I)**2
-            Terma = Xxxxi(Ii)*(One-Xxxxi(Ii)) - Xxxxr(Ii)**2
+            Zz = calc%Zke(I, Igr)**2
+            Terma = calc%Xxxxi(Ii)*(One-calc%Xxxxi(Ii)) - calc%Xxxxr(Ii)**2
             DO J=1,I
                Ij = Ij + 1
                IF (J.NE.I) THEN
-                  Ar = - Xxxxr(Ij)**2 - Xxxxi(Ij)**2
+                  Ar = - calc%Xxxxr(Ij)**2 - calc%Xxxxi(Ij)**2
                   Ar = Ar + Ar
                   Terma = Terma + Ar
                END IF
             END DO
             Terma = Terma / Zz
-            Crss(2) = Terma + Crss(2)
+            val = Terma + val
          END DO
-         Crss(2) = Crss(2)*Dgoj
+         val = val * Dgoj + calc%crossInternal(2, igr, 0)
+         calc%crossInternal(2, igr, 0) = val
       END IF
 !
       IF (Next.GT.0 .and. Ntotnn.GT.Nent) THEN
 ! ***    reaction ch c'= g*0.25 * sum(inc c) |U(c,c')|**2 / Zz
 ! ***                  = g* (Xxxxr**2 + Xxxxi**2) / Zz
+         calc%termf = Zero
          DO Jj=1,Next
-            Termf(Jj) = Zero
-         END DO
-         DO Jj=1,Next
-            IF (Jj+Nent.LE.Ntotnn .AND. Ifcros(Jj+2).NE.0) THEN
-               IF ( (Kaptur.EQ.0 .AND. If_Excl(Jj+Nent).EQ.0) .OR.   &
-                    (Kaptur.EQ.1 .AND. If_Excl(Jj+Nent).EQ.1)    ) THEN
+            IF (Jj+Nent.LE.Ntotnn .AND. calc%Ifcros(Jj+2)) THEN
+               call spinInfo%getChannelInfo(channelInfo, Jj+Nent)
+               ifs = channelInfo%getIncludeInCalc()
+               IF ( (.not.calc%addElimKapt .AND.      Ifs) .OR.   &
+                    (     calc%addElimKapt .AND. .not.Ifs) ) THEN
                   J = Jj + Nent
                   DO I=1,Nent
-                     Zz = Zke(I)**2
+                     Zz = calc%Zke(I, Igr)**2
                      Ij = (J*(J-1))/2 + I
 !q                   Ij = Ijkl(I,J) but I < J always
-                     Termf(Jj) = Termf(Jj) +    &
-                                          (Xxxxr(Ij)**2+Xxxxi(Ij)**2)/Zz
+                     calc%Termf(Jj) = calc%Termf(Jj) +    &
+                                          (calc%Xxxxr(Ij)**2+calc%Xxxxi(Ij)**2)/Zz
                   END DO
                END IF
-               Crss(2+Jj) = Termf(Jj)*Dgoj
+               val = calc%Termf(Jj)*Dgoj + calc%crossInternal(2+Jj, igr, 0)
+               calc%crossInternal(2+Jj, igr, 0) = val
             END IF
          END DO
       END IF
 !
 !
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
 !
-! ***    Angular Distribution   Crssx(.,i,ix,igroup) = (1-U)/2
-         call resParData%getSpinGroupInfo(spinInfo, igr)
+! ***    Angular Distribution   Crssx(.,i,ix,igroup) = (1-U)/2         
          DO Ichan=1,Ntotnn
             call spinInfo%getChannelInfo(channelInfo, Ichan)
-            call resParData%getChannel(channel, channelInfo)
+            call calc%resData%getChannel(channel, channelInfo)
             Lspin = channel%getL()
-            Ifs = If_Stay (Ichan, Ifdif, Nent, If_Excl(Ichan), Kaptur)
-            IF (Ifs.EQ.0) THEN
+
+            IF (calc%useChannel(Ichan,2)) THEN
 !
-               IF (Zeta(Ichan).NE.Zero .AND. Su.GT.Echan(Ichan)) THEN
+               IF (calc%Zeta(Ichan, Igr).NE.Zero .AND. Su.GT.calc%Echan(Ichan,Igr)) THEN
                   CALL Get_Coul_Phase (Cr, Ci, Lspin,   &
-                     Echan(Ichan), Zeta(Ichan), Su)
+                     calc%Echan(Ichan, Igr), calc%Zeta(Ichan, Igr), Su)
                ELSE
                   Cr = One
                   Ci = Zero
                END IF
                DO Ichanx=1,Nent
                   call spinInfo%getChannelInfo(channelInfo, Ichanx)
-                  call resParData%getChannel(channel, channelInfo)
+                  call calc%resData%getChannel(channel, channelInfo)
                   Lspinx = channel%getL()
                   IF (Ichanx.LE.Ichan) THEN
                      II = (Ichan*(Ichan-1))/2 + Ichanx
@@ -193,26 +196,26 @@
                   END IF
 ! ***             real and imaginary parts of (1-U)/2
                   IF (Ichanx.EQ.Ichan) THEN
-                     Ar = Sinsqr(Ichan)*(One-Two*Xxxxi(II))   &
-                                - Sin2ph(Ichan)*Xxxxr(II) + Xxxxi(II)
-                     Ai = Sin2ph(Ichan)*(0.5d0-Xxxxi(II))   &
-                                - (One-Two*Sinsqr(Ichan)) * Xxxxr(II)
+                     Ar = calc%Sinsqr(Ichan)*(One-Two*calc%Xxxxi(II))   &
+                                - calc%Sin2ph(Ichan)*calc%Xxxxr(II) + calc%Xxxxi(II)
+                     Ai = calc%Sin2ph(Ichan)*(0.5d0-calc%Xxxxi(II))   &
+                                - (One-Two*calc%Sinsqr(Ichan)) * calc%Xxxxr(II)
                   ELSE
-                     Ar = Cscs(1,II)*Xxxxi(II) - Cscs(2,II)*Xxxxr(II)
-                     Ai =-Cscs(1,II)*Xxxxr(II) - Cscs(2,II)*Xxxxi(II)
+                     Ar = calc%Cscs(1,II)*calc%Xxxxi(II) - calc%Cscs(2,II)*calc%Xxxxr(II)
+                     Ai =-calc%Cscs(1,II)*calc%Xxxxr(II) - calc%Cscs(2,II)*calc%Xxxxi(II)
                   END IF
-                  If (Zeta(Ichan ).NE.Zero .OR.   &
-                      Zeta(Ichanx).NE.Zero) THEN
+                  If (calc%Zeta(Ichan, Igr).NE.Zero .OR.   &
+                      calc%Zeta(Ichanx,Igr).NE.Zero) THEN
                      Br = Ar*Cr - Ai*Ci
                      Bi = Ar*Ci + Ai*Cr
                      IF ((Lspinx.NE.Lspin .OR.   &
-                        Zeta(Ichanx).NE.Zeta(Ichan)) .AND.   &
+                        calc%Zeta(Ichanx,Igr).NE.calc%Zeta(Ichan,Igr)) .AND.   &
                         Ichan.NE.Ichanx ) THEN
-                        IF (Zeta(Ichanx).NE.Zero .AND.   &
-                           Su.GT.Echan(Ichanx)) THEN
+                        IF (calc%Zeta(Ichanx,Igr).NE.Zero .AND.   &
+                           Su.GT.calc%Echan(Ichanx, Igr)) THEN
                            CALL Get_Coul_Phase (Dr, Di,   &
-                              Lspinx, Echan(Ichanx),   &
-                              Zeta(Ichanx), Su)
+                              Lspinx, calc%Echan(Ichanx, Igr),   &
+                              calc%Zeta(Ichanx,Igr), Su)
                         ELSE
                            Dr = One
                            Di = Zero
@@ -224,8 +227,8 @@
                      Ar = Br*Dr - Bi*Di
                      Ai = Br*Di + Bi*Dr
                   END IF
-                  Crssx(1,Ichanx  ,Ichan,Nnnn ) = Ar
-                  Crssx(2,Ichanx  ,Ichan,Nnnn ) = Ai
+                  calc%angInternal(1,Ichanx  ,Ichan,Igr, 0) = Ar
+                  calc%angInternal(2,Ichanx  ,Ichan,Igr, 0) = Ai
 !                         entrance,exit ,group
                END DO
             END IF
@@ -240,6 +243,7 @@
 ! --------------------------------------------------------------
 !
       INTEGER FUNCTION Ijkl (M,N)
+      integer::M,N
       IF (M.LE.N) THEN
          Ijkl = (N*(N-1))/2 + M
       ELSE
@@ -247,31 +251,4 @@
       END IF
       RETURN
       END
-!
-!
-! --------------------------------------------------------------
-!
-      INTEGER FUNCTION If_Stay (Ichan, Ifdif, Nent, If_Excl, Kaptur)
-! *** If_Stay = 0 if want this channel, If_Stay = 1 if do not
-      If_Stay = 0
-      IF (Ifdif.EQ.1 .AND. Ichan.GT.Nent) THEN
-! ***    Ifdif=1 means elastic
-         If_Stay = 1
-      ELSE IF (Ifdif.EQ.2) THEN
-! ***    Ifdif=2 means reaction of some kind
-         IF (Ichan.LE.Nent) THEN
-            If_Stay = 1
-! ***       Do not want elastic
-         ELSE IF (Kaptur.EQ.0 .AND. If_Excl.EQ.1) THEN
-            If_Stay = 1
-! ***       Do not want excluded channel in final state
-         ELSE IF (Kaptur.EQ.1 .AND. If_Excl.EQ.0) THEN
-            If_Stay = 1
-! ***       Will subtract only excluded channels from absorption
-         ELSE IF (If_Excl.EQ.-1) THEN
-            If_Stay = -1
-! ***       Do not want excluded channel anywhere in the calculation
-         END IF
-      END IF
-      RETURN
-      END
+end module mxct09_m
diff --git a/sammy/src/xct/mxct10.f90 b/sammy/src/xct/mxct10.f90
index 77e12f92b..9f2180d6a 100644
--- a/sammy/src/xct/mxct10.f90
+++ b/sammy/src/xct/mxct10.f90
@@ -1,53 +1,50 @@
+module mxct10_m
+use XctCrossCalc_M
+contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Setqri (Yinv, Xqr, Xqi, Rootp, Elinvr, Elinvi, Qr, Qi,   &
-         Psmall, Ntot)
+      SUBROUTINE Setqri (calc, Ntot)
 !
 ! *** Purpose -- Generate QR,QI =
 ! ***                   SQRT(P)/(S-B+IP) * Yinv*Yinv * SQRT(P)/(S-B+IP)
 ! ***
 ! *** That is, Qr(KL,Ij) is (real part of) partial of XXXX(Kl) wrt R(Ij)
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct09_m
+      IMPLICIT None
 !
 !
-      DIMENSION Yinv(2,*), Qr(Nn,*), Qi(NN,*), Psmall(*),   &
-         Xqr(Ntot,*), Xqi(Ntot,*), Rootp(*), Elinvr(*), Elinvi(*)
+      class(XctCrossCalc)::calc
+      integer::ntot
+      integer::I, Ij, J, K, Kl, L, IK
+      real(kind=8)::Plii, Plri
 !
-!      DIMENSION Yinv(2,nn), Qr(Nn,Nn), Qi(Nn,Nn),
-!     *   Xqr(Ntot,Ntot), Xqi(Ntot,Ntot), Rootp(Ntot),
-!     *   Elinvr(Ntot), Elinvi(Ntot), Psmall(Ntot)
-!
-      EXTERNAL Ijkl
-      DATA Zero /0.0d0/
+      real(kind=8), parameter::Zero = 0.0d0
 !
 !
 ! *** redefine meaning of Xqr & Xqi
 ! *** Xq = Rootp*Yinv
       DO I=1,Ntot
-         Plri = Rootp(I)*Elinvr(I)
-         Plii = Rootp(I)*Elinvi(I)
+         Plri = calc%Rootp(I)*calc%Elinvr(I)
+         Plii = calc%Rootp(I)*calc%Elinvi(I)
          DO K=1,Ntot
             IK = IJKL(I,K)
-            Xqr(K,I) = Plri*Yinv(1,IK) - Plii*Yinv(2,IK)
-            Xqi(K,I) = Plri*Yinv(2,IK) + Plii*Yinv(1,IK)
-            IF (Psmall(K).GT.Zero) THEN
-               Xqr(K,I) = Xqr(K,I)*Psmall(K)
-               Xqi(K,I) = Xqi(K,I)*Psmall(K)
-            ELSE IF (Psmall(K).LT.Zero) THEN
-               Xqr(K,I) = Zero
-               Xqi(K,I) = Zero
+            calc%Xqr(K,I) = Plri*calc%Yinv(1,IK) - Plii*calc%Yinv(2,IK)
+            calc%Xqi(K,I) = Plri*calc%Yinv(2,IK) + Plii*calc%Yinv(1,IK)
+            IF (calc%Psmall(K).GT.Zero) THEN
+               calc%Xqr(K,I) = calc%Xqr(K,I)*calc%Psmall(K)
+               calc%Xqi(K,I) = calc%Xqi(K,I)*calc%Psmall(K)
+            ELSE IF (calc%Psmall(K).LT.Zero) THEN
+               calc%Xqr(K,I) = Zero
+               calc%Xqi(K,I) = Zero
             END IF
          END DO
       END DO
 !
-      CALL Zero_Array (Qr, Nn*Nn)
-      CALL Zero_Array (Qi, Nn*Nn)
+      calc%Qr = Zero
+      calc%Qi = Zero
 !
       Ij = 0
       DO I=1,Ntot
@@ -57,15 +54,15 @@
             DO K=1,Ntot
                DO L=1,K
                   KL = KL + 1
-                  Qr(KL,Ij) = Xqr(I,K)*Xqr(J,L) -   &
-                              Xqi(I,K)*Xqi(J,L)
-                  Qi(KL,Ij) = Xqr(I,K)*Xqi(J,L) +   &
-                              Xqi(I,K)*Xqr(J,L)
+                  calc%Qr(KL,Ij) = calc%Xqr(I,K)*calc%Xqr(J,L) -   &
+                              calc% Xqi(I,K)*calc%Xqi(J,L)
+                  calc%Qi(KL,Ij) = calc%Xqr(I,K)*calc%Xqi(J,L) +   &
+                              calc%Xqi(I,K)*calc%Xqr(J,L)
                   IF (I.NE.J) THEN
-                     Qr(KL,Ij) = Qr(KL,Ij) + Xqr(J,K)*Xqr(I,L) -   &
-                                             Xqi(J,K)*Xqi(I,L)
-                     Qi(KL,Ij) = Qi(KL,Ij) + Xqr(J,K)*Xqi(I,L) +   &
-                                             Xqi(J,K)*Xqr(I,L)
+                     calc%Qr(KL,Ij) = calc%Qr(KL,Ij) + calc%Xqr(J,K)*calc%Xqr(I,L) -   &
+                                             calc%Xqi(J,K)*calc%Xqi(I,L)
+                     calc%Qi(KL,Ij) = calc%Qi(KL,Ij) + calc%Xqr(J,K)*calc%Xqi(I,L) +   &
+                                             calc%Xqi(J,K)*calc%Xqr(I,L)
                   END IF
                END DO
             END DO
@@ -78,108 +75,111 @@
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Settri (Nent, Next, igr, Echan, If_Excl, Zke, Zeta,   &
-         Ifcros, Xxxxr, Xxxxi, Sinsqr, Sin2ph, Cscs, Qr, Qi, Tr, Ti, Tx,   &
-         Ntot)
+      SUBROUTINE Settri (spinInfo,calc, igr)
 !
 ! *** Purpose -- Generate Tr & Ti, which are 0.5 * [the real and
 ! ***            imaginary parts of the partial of Crss with respect to R]
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      use EndfData_common_m
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
       use mxct26_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct09_m
+      IMPLICIT None
 !
+      class(XctCrossCalc)::calc
       type(SammySpinGroupInfo)::spinInfo
+      integer::igr
       type(SammyChannelInfo)::channelInfo
-      type(RMatChannelParams)::channel
-      DIMENSION Echan(*), If_Excl(*), Zke(*), Zeta(*),   &
-         Ifcros(*), Xxxxr(*), Xxxxi(*), Sinsqr(*), Sin2ph(*), Cscs(2,*),   &
-         Qr(NN,*), Qi(NN,*), Tr(Ncrsss,*), Ti(Ncrsss,*), Tx(2,Ntriag,*)
+      type(RMatChannelParams)::channel      
 !
-      DATA Zero /0.0d0/, Half /0.5d0/, One /1.0d0/, Two /2.0d0/
+      real(kind=8),parameter::Zero = 0.0d0, Half = 0.5d0, One = 1.0d0, Two = 2.0d0
+      integer::Nent, Next, Ntot
+      logical::Ifs
+      real(kind=8)::Ai, Ar, Bi, Br, Ci, Cr, Di, Dr, Zz, Su
+      integer::I, I_Ifcros, Ix, Iy, Ij, J, K, Kk, Kl, L, Lspin, LspinL, M
+
+      Nent = spinInfo%getNumEntryChannels()
+      Next = spinInfo%getNumExitChannels()
+      Ntot = spinInfo%getNumChannels()
+      Su = dAbs(calc%ener)
 !
-      IF (Ncrssx.NE.0) THEN
+      IF (any(calc%Ifcros)) THEN
 !
-         CALL Zero_Array (TR, Ncrsss*Ntriag)
-         CALL Zero_Array (TI, Ncrsss*Ntriag)
+         calc%Tr = 0.0d0
+         calc%Ti = 0.0d0
 !
 ! ***    GENERATE Tr AND Ti, WHERE
 ! ***        Tr(M,Ij) = REAL PART OF PARTIAL (Mth CROSS SECTION) WITH
 ! ***                   RESPECT TO R(Ij), EXCEPT FOR c=4pi/E
 !
 !
-         IF (Ifcros(1).NE.0) THEN
+         IF (calc%Ifcros(1)) THEN
 ! ***       first, integrated elastic, diagonal in channel #'s
             KL = 0
             DO K=1,Nent
-               Zz = Zke(K)**2
+               Zz = calc%Zke(K, Igr)**2
                KL = KL + K
                Ij = 0
                DO I=1,Ntot
                   DO J=1,I
                      Ij = Ij + 1
-                     IF (Qi(KL,Ij).NE.Zero .OR. QR(KL,Ij).NE.Zero) THEN
-                        Ar = Qr(KL,Ij)*(-Sin2ph(K)*Half) +   &
-                             Qi(KL,Ij)*(-Sinsqr(K))
-                        Ai = Qi(KL,Ij)*(-Sin2ph(K)*Half) -   &
-                             Qr(KL,Ij)*(-Sinsqr(K))
-                        Tr(1,Ij) = Tr(1,Ij) + Ar/Zz
-                        Ti(1,Ij) = Ti(1,Ij) + Ai/Zz
+                     IF (calc%Qi(KL,Ij).NE.Zero .OR. calc%QR(KL,Ij).NE.Zero) THEN
+                        Ar = calc%Qr(KL,Ij)*(-calc%Sin2ph(K)*Half) +   &
+                             calc%Qi(KL,Ij)*(-calc%Sinsqr(K))
+                        Ai = calc%Qi(KL,Ij)*(-calc%Sin2ph(K)*Half) -   &
+                             calc%Qr(KL,Ij)*(-calc%Sinsqr(K))
+                        calc%Tr(1,Ij) = calc%Tr(1,Ij) + Ar/Zz
+                        calc%Ti(1,Ij) = calc%Ti(1,Ij) + Ai/Zz
                      END IF
                   END DO
                END DO
             END DO
          END IF
 !
-         IF (Ifcros(2).NE.0) THEN
+         IF (calc%Ifcros(2)) THEN
 ! ***       next, absorption only, diagonal in channel numbers
             KL = 0
             DO K=1,Nent
-               Zz = Zke(K)**2 * Two
+               Zz = calc%Zke(K, Igr)**2 * Two
                KL = KL + K
                Ij = 0
                DO I=1,Ntot
                   DO J=1,I
                      Ij = Ij + 1
-                     IF (Qi(KL,Ij).NE.Zero) Tr(2,Ij) = Tr(2,Ij) +   &
-                                                 Qi(KL,Ij)/Zz
-                     IF (Qr(KL,Ij).NE.Zero) Ti(2,Ij) = Ti(2,Ij) -   &
-                                                 Qr(KL,Ij)/Zz
+                     IF (calc%Qi(KL,Ij).NE.Zero) calc%Tr(2,Ij) = calc%Tr(2,Ij) +   &
+                                                 calc%Qi(KL,Ij)/Zz
+                     IF (calc%Qr(KL,Ij).NE.Zero) calc%Ti(2,Ij) = calc%Ti(2,Ij) -   &
+                                                 calc%Qr(KL,Ij)/Zz
                   END DO
                END DO
             END DO
          END IF
 !
-         IF (Ifcros(1).EQ.1 .OR. Ifcros(2).EQ.1) THEN
+         IF (calc%Ifcros(1) .OR. calc%Ifcros(2)) THEN
 ! ***       next, not-necessarily diagonal pieces of elastic & capture
             KL = 0
             DO K=1,Nent
-               Zz = Zke(K)**2
+               Zz = calc%Zke(K, Igr)**2
                DO L=1,K
                   KL = KL + 1
                   Ij = 0
                   DO I=1,Ntot
                      DO J=1,I
                         Ij = Ij + 1
-                        IF (Qi(KL,Ij).NE.Zero.OR.Qr(KL,Ij).NE.Zero) THEN
-                          Ar = Qr(KL,Ij)*Xxxxr(Kl) + Qi(KL,Ij)*Xxxxi(KL)
-                          Ai = Qi(KL,Ij)*Xxxxr(Kl) - Qr(KL,Ij)*Xxxxi(KL)
+                        IF (calc%Qi(KL,Ij).NE.Zero.OR.calc%Qr(KL,Ij).NE.Zero) THEN
+                          Ar = calc%Qr(KL,Ij)*calc%Xxxxr(Kl) + calc%Qi(KL,Ij)*calc%Xxxxi(KL)
+                          Ai = calc%Qi(KL,Ij)*calc%Xxxxr(Kl) - calc%Qr(KL,Ij)*calc%Xxxxi(KL)
                           IF (K.NE.L) THEN
                              Ar = Ar*Two
                              Ai = Ai*Two
                           END IF
-                          IF (Ifcros(1).EQ.1) THEN
-                             Tr(1,Ij) = Tr(1,Ij) + Ar/Zz
-                             Ti(1,Ij) = Ti(1,Ij) + Ai/Zz
+                          IF (calc%Ifcros(1)) THEN
+                             calc%Tr(1,Ij) = calc%Tr(1,Ij) + Ar/Zz
+                             calc%Ti(1,Ij) = calc%Ti(1,Ij) + Ai/Zz
                           END IF
-                          IF (Ifcros(2).EQ.1) THEN
-                             Tr(2,Ij) = Tr(2,Ij) - Ar/Zz
-                             Ti(2,Ij) = Ti(2,Ij) - Ai/Zz
+                          IF (calc%Ifcros(2)) THEN
+                             calc%Tr(2,Ij) = calc%Tr(2,Ij) - Ar/Zz
+                             calc%Ti(2,Ij) = calc%Ti(2,Ij) - Ai/Zz
                           END IF
                         END IF
                      END DO
@@ -188,11 +188,11 @@
             END DO
          END IF
 !
-         IF (Ncrsss.GE.3) THEN
+         IF (calc%ntotc.GE.2) THEN
 ! ***       next, reactions
             I_Ifcros = 0
             DO KK=1,Next
-               IF (Ifcros(KK+2).NE.0) I_Ifcros = 1
+               IF (calc%Ifcros(KK+2)) I_Ifcros = 1
             END DO
             IF (I_Ifcros.EQ.1) THEN
                KL = 0
@@ -200,21 +200,21 @@
                   DO L=1,K
                      KL = KL + 1
                      IF (L.LE.Nent .AND. K.GT.Nent) THEN
-                        Zz = Zke(L)**2
+                        Zz = calc%Zke(L, Igr)**2
                         M = K - Nent + 2
-                        IF (Ifcros(M).GT.0) THEN
+                        IF (calc%Ifcros(M)) THEN
                            IJ = 0
                            DO I=1,Ntot
                               DO J=1,I
                                  IJ = IJ + 1
-                                 IF (Qi(KL,Ij).NE.Zero .OR.   &
-                                     Qr(KL,Ij).NE.Zero     ) THEN
-                                    Tr(M,Ij) = Tr(M,Ij) +   &
-                                       ( Qr(KL,Ij)*Xxxxr(Kl) +   &
-                                         Qi(KL,Ij)*Xxxxi(Kl)   )/Zz
-                                    Ti(M,Ij) = Ti(M,Ij) +   &
-                                       ( Qi(KL,Ij)*Xxxxr(Kl) -   &
-                                         Qr(KL,Ij)*Xxxxi(Kl)   )/Zz
+                                 IF (calc%Qi(KL,Ij).NE.Zero .OR.   &
+                                     calc%Qr(KL,Ij).NE.Zero     ) THEN
+                                     calc%Tr(M,Ij) = calc%Tr(M,Ij) +   &
+                                       ( calc%Qr(KL,Ij)*calc%Xxxxr(Kl) +   &
+                                         calc%Qi(KL,Ij)*calc%Xxxxi(Kl)   )/Zz
+                                    calc%Ti(M,Ij) = calc%Ti(M,Ij) +   &
+                                       ( calc%Qi(KL,Ij)*calc%Xxxxr(Kl) -   &
+                                         calc%Qr(KL,Ij)*calc%Xxxxi(Kl)   )/Zz
                                  END IF
                               END DO
                            END DO
@@ -230,17 +230,17 @@
 !
 !
 !
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
 !
 ! ***    For angular distributions
 ! ***      prtl (1-U)(kl) wrt R(ij) = prtl(1-U)(kl) wrt X(kl) * prtl X wrt R
 ! ***      Tx(1,ij,kl) = prtl Re(1-U) wrt ReR = -prtl Im (1-U) wrt ImR
 ! ***      Tx(2,ij,kl) = prtl Re(1-U) wrt ImR =  prtl Re (1-U) wrt ReR
 !
-         CALL Zero_Array (Tx, 2*Ntriag*Ntriag)
+         calc%Tx = 0.0d0
 !
 ! ***    first, do diagonal (in K & L) ... only for elastic
-         IF (Ifdif.EQ.1) THEN
+         IF (calc%reactType.ne.11) THEN
             KL = 0
             DO K=1,Nent
                KL = KL + K
@@ -248,14 +248,14 @@
                DO I=1,Ntot
                   DO J=1,I
                      Ij = Ij + 1
-                     IF (QI(KL,Ij).NE.Zero .OR. QR(KL,Ij).NE.Zero) THEN
+                     IF (calc%QI(KL,Ij).NE.Zero .OR. calc%QR(KL,Ij).NE.Zero) THEN
 ! ***                   Qr = Qr*Dr - Qi*Di,  Ai = Qi*Dr + Qr*Di
-                        Ar = Qr(KL,Ij)*(-Sin2ph(K)) -   &
-                             Qi(KL,Ij)*(Two*Sinsqr(K)-One)
-                        Ai = Qi(KL,Ij)*(-Sin2ph(K)) +   &
-                             Qr(KL,Ij)*(Two*Sinsqr(K)-One)
-                        Tx(1,Ij,KL) = Ar
-                        Tx(2,Ij,KL) = Ai
+                        Ar = calc%Qr(KL,Ij)*(-calc%Sin2ph(K)) -   &
+                             calc%Qi(KL,Ij)*(Two*calc%Sinsqr(K)-One)
+                        Ai = calc%Qi(KL,Ij)*(-calc%Sin2ph(K)) +   &
+                             calc%Qr(KL,Ij)*(Two*calc%Sinsqr(K)-One)
+                        calc%Tx(1,Ij,KL) = Ar
+                        calc%Tx(2,Ij,KL) = Ai
                      END IF
                   END DO
                END DO
@@ -266,24 +266,24 @@
          KL = 0
          DO L=1,Ntot
             DO K=1,L
-               Ifs = If_Stay (L, Ifdif, Nent, If_Excl(L), Kaptur)
+               Ifs = calc%useChannel(L,2)
                KL = KL + 1
-               IF (Ifs.EQ.0 .AND. K.LE.Nent) THEN
+               IF (Ifs.AND. K.LE.Nent) THEN
                   IF (K.NE.L) THEN
                      IJ = 0
                      DO I=1,Ntot
                         IJ = (I*(I-1))/2
                         DO J=1,I
                            IJ = IJ + 1
-                           IF (Qi(KL,Ij).NE.Zero .OR.   &
-                               Qr(KL,Ij).NE.Zero) THEN
+                           IF (calc%Qi(KL,Ij).NE.Zero .OR.   &
+                               calc%Qr(KL,Ij).NE.Zero) THEN
 ! ***                         Ar = Qr*Dr - Qi*Di,  Ai = Qi*Dr + Qr*Di
-                              Ar = -Qr(KL,Ij)*Cscs(2,KL) +   &
-                                    Qi(KL,Ij)*Cscs(1,KL)
-                              Ai = -Qi(KL,Ij)*Cscs(2,KL) -   &
-                                    Qr(KL,Ij)*Cscs(1,KL)
-                              Tx(1,Ij,KL) = Ar
-                              Tx(2,Ij,KL) = Ai
+                              Ar = -calc%Qr(KL,Ij)*calc%Cscs(2,KL) +   &
+                                    calc%Qi(KL,Ij)*calc%Cscs(1,KL)
+                              Ai = -calc%Qi(KL,Ij)*calc%Cscs(2,KL) -   &
+                                    calc%Qr(KL,Ij)*calc%Cscs(1,KL)
+                              calc%Tx(1,Ij,KL) = Ar
+                              calc%Tx(2,Ij,KL) = Ai
                            END IF
                         END DO
                      END DO
@@ -294,16 +294,15 @@
 !
 ! ***    Now multiply by Coulomb phase shift if needed
 !
-         call resParData%getSpinGroupInfo(spinInfo, igr)
          DO K=1,Ntot
             call spinInfo%getChannelInfo(channelInfo, K)
-            call resParData%getChannel(channel, channelInfo)
+            call calc%resData%getChannel(channel, channelInfo)
             Lspin = channel%getL()
 
-            IF (If_Stay (K,Ifdif,Nent,If_Excl(K),Kaptur) .EQ.0) THEN
-               IF (Zeta(K).NE.Zero .AND. Su.GT.Echan(K)) THEN
-                  CALL Get_Coul_Phase (Cr, Ci, Lspin, Echan(K),   &
-                     Zeta(K), Su)
+            IF (calc%useChannel(K,2)) THEN
+               IF (calc%Zeta(K, igr).NE.Zero .AND. Su.GT.calc%Echan(K, Igr)) THEN
+                  CALL Get_Coul_Phase (Cr, Ci, Lspin, calc%Echan(K, Igr),   &
+                     calc%Zeta(K, Igr), Su)
                   Ix = 1
                ELSE
                   Cr = One
@@ -314,7 +313,7 @@
                KL = (K*(K-1))/2
                DO L=1,K
                   call spinInfo%getChannelInfo(channelInfo, L)
-                  call resParData%getChannel(channel, channelInfo)
+                  call calc%resData%getChannel(channel, channelInfo)
                   LspinL = channel%getL()
                   KL = KL + 1
                   IF (K.EQ.L) THEN
@@ -322,9 +321,9 @@
                      Di = Ci
                      Iy = Ix
                   ELSE
-                     IF (Zeta(L).NE.Zero .AND. Su.GT.Echan(L)) THEN
-                        CALL Get_Coul_Phase (Dr, Di, LspinL, Echan(L),   &
-                           Zeta(L), Su)
+                     IF (calc%Zeta(L, Igr).NE.Zero .AND. Su.GT.calc%Echan(L, Igr)) THEN
+                        CALL Get_Coul_Phase (Dr, Di, LspinL, calc%Echan(L, Igr),   &
+                           calc%Zeta(L, Igr), Su)
                         Iy = 1
                      ELSE
                         Dr = One
@@ -338,8 +337,8 @@
                      DO I=1,Ntot
                         DO J=1,I
                            IJ = IJ + 1
-                           Ar = Tx(1,IJ,KL)
-                           Ai = Tx(2,IJ,KL)
+                           Ar = calc%Tx(1,IJ,KL)
+                           Ai = calc%Tx(2,IJ,KL)
                            IF (Ix.EQ.0) THEN
                               Br = Ar
                               Bi = Ai
@@ -354,8 +353,8 @@
                               Ar = Br*Dr - Bi*Di
                               Ai = Br*Di + Bi*Dr
                            END IF
-                           Tx(1,IJ,KL) = Ar
-                           Tx(2,IJ,KL) = Ai
+                           calc%Tx(1,IJ,KL) = Ar
+                           calc%Tx(2,IJ,KL) = Ai
                         END DO
                      END DO
                   END IF
@@ -367,3 +366,4 @@
       END IF
       RETURN
       END
+end module mxct10_m
diff --git a/sammy/src/xct/mxct11.f90 b/sammy/src/xct/mxct11.f90
index 2f9de07ea..507a3ad6f 100644
--- a/sammy/src/xct/mxct11.f90
+++ b/sammy/src/xct/mxct11.f90
@@ -1,331 +1,221 @@
 module mxct11_m
 use XctCrossCalc_M
 contains
+     logical function wantChannelInCalc(calc, spinInfo, ichan, nent) result(want)
+     type(SammySpinGroupInfo):: spinInfo
+     class(XctCrossCalc)::calc
+     type(SammyChannelInfo)::channelInfo
+     integer::ichan, nent, K
+     logical::inc
+
+     want = .false.
+     if (ichan.le.2) then
+        want = .true.
+        return
+     end if
+     k = Ichan-2+Nent
+     inc = .true.
+     if (k.le.spinInfo%getNumChannels()) then
+        call spinInfo%getChannelInfo(channelInfo, k)
+        inc =  channelInfo%getIncludeInCalc()
+     end if
+     if (inc) then
+        if (.not.calc%addElimKapt) want = .true.
+     else
+        if (calc%addElimKapt) want = .true.
+     end if
+     end function wantChannelInCalc
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derres (calc, Nent,If_Excl, Ifcros, Deriv,           &
-         Derivx, Tr, Ti, Tx, Notu, Ddddd, Dgoj, Ntot, Minres, Maxres)
+      SUBROUTINE Derres (spinInfo , calc, Igr, iparStart)
 !
 ! *** Purpose -- Generate Deriv(k,ipar) = partial Crss(k) wrt U(ipar) for
 !                                 resonance params
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      integer::Notu(:)
+      use SammySpinGroupInfo_M
+      use mxct09_m
+      IMPLICIT none
 !
+      type(SammySpinGroupInfo):: spinInfo
       class(XctCrossCalc)::calc
-      DIMENSION  If_Excl(*), Ifcros(*),                               &
-        Deriv(Ncrsss,*), Derivx(2,Ntotc,Ntotc,*),                     &
-        Tr(Ncrsss,*), Ti(Ncrsss,*), Tx(2,Ntriag,*), Ddddd(*)
-       integer::idPos
-!
-!  Napres -> all parameters for which derivatives are needed
-!            not restricted to resonance parameters
-!            only distantly related to the parameter of the same
-!            name that was in fixedi_m
-!      DIMENSION Ifcros(Ncrsss),
-!     *   Deriv(Ncrsss,Napres), Derivx(2,Ntotc,Ntotc,Nnpar),
-!     *   Tr(Ncrsss,Nn), Ti(Ncrsss,Nn), Tx(2,Ntriag,Ntriag),
-!     *   Ddddd(Ncrsss)
+      integer::iparStart
+      integer::idPos, Igr, Nent, Ntot
+      real(kind=8)::Dgoj, val, A1, A2
+      integer::I, Ichanx, Ij, J, K, Kl, M, Mm, Ichan, Ix
 !
-      DATA Zero /0.0d0/
+      real(kind=8):: Zero = 0.0d0
 !
+      nent = spinInfo%getNumEntryChannels()
+      ntot = spinInfo%getNumChannels()
+      Dgoj = spinInfo%getGFactor()
+
+
+      IF (any(calc%Ifcros)) THEN
+         DO Mm=1,calc%inumSize
+            M = iparStart + Mm
+            idPos = calc%Inum(Mm,1)
+            if (.not.calc%covariance%contributes(idPos)) cycle
 !
-      IF (Ncrssx.NE.0) THEN
-         DO Mm=1,Npr
-            M = Kstart + Mm
-            idPos = Notu(M)
-!                                      Note that M = parameter number
-            IF (idPos.gt.0) THEN
                IJ = 0
-               DO K=1,Ncrsss
-                  Ddddd(K) = Zero
-               END DO
-               DO I=1,Ntot
+               calc%Ddddd = Zero
+               DO I=1,calc%ntotc
                   DO J=1,I
                      IJ = IJ + 1
-                     IF (calc%Pi(Ij,M).NE.Zero) THEN
-                        DO K=1,Ncrsss
-                           IF (Ifcros(K).NE.0) THEN
-                              IF (K.LE.2 .OR.If_Excl(K-2+Nent).EQ.Kaptur) THEN
-! *** Kaptur=1 and If_Excl=1 means subtract this excluded channel from
+                     IF (calc%Pi(Ij,M).NE.Zero.or.calc%Pr(Ij,M).NE.Zero) THEN
+                        DO K=1,calc%Ntotc + 1
+                          IF (calc%useChannel(K,1)) THEN  ! check for ifcross has been added to useChannel
+! *** Kaptur=1 (now calc%addElimKapt == true) and If_Excl=1 (not channelInfo%getIncludeInCalc() == false) means subtract this excluded channel from
 ! ***    absorption to give the eliminated gamma channel contribution
-                                 Ddddd(K) = Ddddd(K) - calc%Pi(Ij,M)*Ti(K,Ij)
-                              END IF
-                           END IF
-                        END DO
-                     END IF
-                     IF (calc%Pr(Ij,M).NE.Zero) THEN
-                        DO K=1,Ncrsss
-                           IF (Ifcros(K).NE.0) THEN
-                              IF (K.LE.2 .OR.If_Excl(K-2+Nent).EQ.Kaptur) THEN
-                                 Ddddd(K) = Ddddd(K) + calc%Pr(Ij,M)*Tr(K,Ij)
-                              END IF
+                                 calc%Ddddd(K) = calc%Ddddd(K) - calc%Pi(Ij,M)*calc%Ti(K,Ij)
+                                 calc%Ddddd(K) = calc%Ddddd(K) + calc%Pr(Ij,M)*calc%Tr(K,Ij)
+
                            END IF
                         END DO
-                     END IF
+                     END IF                    
                   END DO
                END DO
-               DO K=1,Ncrsss
-                  IF (Ifcros(K).NE.0) THEN
-                     IF (K.LE.2 .OR. If_Excl(K-2+Nent).EQ.Kaptur) THEN
-                        Deriv(K,idPos) = Dgoj*Ddddd(K) + Deriv(K,idPos)
-                     END IF
+               DO K=1,calc%Ntotc + 1
+                  IF (calc%Ddddd(K).ne.Zero) THEN
+                     val =  Dgoj*calc%Ddddd(K) + calc%crossInternal(K, Igr, idPos)
+                     calc%crossInternal(K, Igr, idPos) = val
                   END IF
                END DO
-            END IF
+
          END DO
       END IF
 !
 !
-      IF (Ifdif.NE.0) THEN
-         DO Mm=1,Npr
-            M = Kstart + Mm
-            idPos = Notu(M)
-            IF (idPos.gt.0) THEN
-               DO IJ=1,NN
+      IF (calc%needAngular) THEN
+         DO Mm=1,calc%inumSize
+            M = iparStart + Mm
+            idPos = calc%Inum(Mm,1)
+            if (.not.calc%covariance%contributes(idPos)) cycle
+
+               DO IJ=1,calc%ntriag
                   IF (calc%Pi(Ij,M).NE.Zero .OR. calc%Pr(Ij,M).NE.Zero) THEN
-                     DO Ichan=1,Ntot
-                        Ifs = If_Stay (Ichan, Ifdif, Nent,    &
-                                       If_Excl(Ichan), Kaptur)
-                        IF (Ifs.EQ.0) THEN
+                     DO Ichan=1,Ntot                      
+                        IF (calc%useChannel(Ichan,2)) THEN
                            DO Ichanx=1,Nent
                               IF (Ichanx.LE.Ichan) THEN
                                  Kl = (Ichan*(Ichan-1))/2 + Ichanx
                               ELSE
                                  Kl = (Ichanx*(Ichanx-1))/2 + Ichan
                               END IF
-                              Derivx(1,Ichanx,Ichan,idPos) =     &
-                                Derivx(1,Ichanx,Ichan,idPos) +   &
-                                calc%Pr(Ij,M)*Tx(1,Ij,KL) -      &
-                                calc%Pi(Ij,M)*Tx(2,Ij,KL)
-                              Derivx(2,Ichanx,Ichan,idPos) =     &
-                                Derivx(2,Ichanx,Ichan,idPos) +   &
-                                calc%Pr(Ij,M)*Tx(2,Ij,KL) +      &
-                                calc%Pi(Ij,M)*Tx(1,Ij,KL)
+
+                              Do Ix = 1, 2
+                                 val = calc%angInternal(Ix,Ichanx,Ichan, Igr, idPos)
+                                 select case(ix)
+                                    case(1)
+                                       A1 = calc%Pr(Ij,M)*calc%Tx(1,Ij,KL)
+                                       A2 = -calc%Pi(Ij,M)*calc%Tx(2,Ij,KL)
+                                    case(2)
+                                       A1 = calc%Pr(Ij,M)*calc%Tx(2,Ij,KL)
+                                       A2 = calc%Pi(Ij,M)*calc%Tx(1,Ij,KL)
+                                 end select
+                                 val = val + A1 + A2
+                                 calc%angInternal(Ix,Ichanx,Ichan, Igr, idPos) = val
+                              end do
+
                            END DO
                         END IF
                      END DO
                   END IF
                END DO
-            END IF
-         END DO
-      END IF
-      RETURN
-      END SUBROUTINE Derres
-!
-!
-! --------------------------------------------------------------
-!
-      SUBROUTINE Dercap (calc, Nent, If_Excl, Ifcros, Deriv,         &
-         Derivx, Tr, Ti, Tx, Notu, Ddddd, Dgoj, Ntot, Minres, Maxres)
-!
-! *** Here only if treating all capture-widths as one variable
-! *** Generate Deriv(k,ipar) = partial Crss(k) wrt U(ipar) for
-!                                 resonance params
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      use EndfData_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-!
-      class(XctCrossCalc)::calc
-      type(SammyResonanceInfo)::resInfo
-      DIMENSION If_Excl(*), Ifcros(*),                &
-        Deriv(Ncrsss,*), Derivx(2,Ntotc,Ntotc,*),     &
-        Tr(Ncrsss,*), Ti(Ncrsss,*), Tx(2,Ntriag,*), Notu(*), Ddddd(*)
 
-       DATA Zero /0.0d0/
-!
-!  Napres -> all parameters for which derivatives are needed
-!            not restricted to resonance parameters
-!            only distantly related to the parameter of the same
-!            name that was in fixedi_m
-!      DIMENSION Ifcros(Ncrsss),
-!     *   Deriv(Ncrsss,Napres), Derivx(2,Ntotc,Ntotc,Nnpar),
-!     *   Tr(Ncrsss,Nn), Ti(Ncrsss,Nn), Tx(2,Ntriag,Ntriag),
-!     *   Ddddd(Ncrsss)
-!
-      IF (Ncrssx.NE.0) THEN
-         DO Mm=1,Npr
-            M = Kstart + Mm
-            if (Notu(M).ge.0) cycle
-            Ifl = -1 * Notu(M)
-            DO K=1,Ncrsss
-               Ddddd(K) = Zero
-            END DO
-            Ij = 0
-            DO I=1,Ntot
-               DO J=1,I
-                  Ij = Ij + 1
-                  IF (calc%Pi(Ij,M).NE.Zero) THEN
-                     DO K=1,Ncrsss
-                        IF (Ifcros(K).NE.0) THEN
-                           IF (K.LE.2 .OR.If_Excl(K-2+Nent).EQ.Kaptur) THEN
-                              Ddddd(K) = Ddddd(K) - calc%Pi(Ij,M)*Ti(K,Ij)
-                           END IF
-                        END IF
-                     END DO
-                  END IF
-                  IF (calc%Pr(Ij,M).NE.Zero) THEN
-                     DO K=1,Ncrsss
-                        IF (Ifcros(K).NE.0) THEN
-                           IF (K.LE.2 .OR.If_Excl(K-2+Nent).EQ.Kaptur) THEN
-                              Ddddd(K) = Ddddd(K) + calc%Pr(Ij,M)*Tr(K,Ij)
-                           END IF
-                        END IF
-                     END DO
-                  END IF
-               END DO
-            END DO
-            DO K=1,Ncrsss
-               IF (Ifcros(K).NE.0) THEN
-                  IF (K.LE.2 .OR. If_Excl(K-2+Nent).EQ.Kaptur) THEN
-                     Deriv(K,Ifl) = Dgoj*Ddddd(K) + Deriv(K,Ifl)
-                  END IF
-               END IF
-            END DO
-         END DO
-      END IF
-!
-!
-      IF (Ifdif.NE.0) THEN
-         DO Mm=1,Npr
-            M = Kstart + Mm
-            if (Notu(M).ge.0) cycle
-            Ifl = -1 * Notu(M)
-            DO IJ=1,NN
-               IF (calc%Pi(Ij,M).NE.Zero .OR. calc%Pr(Ij,M).NE.Zero) THEN
-                  KL = 0
-                  DO Ichan=1,Ntot
-                     DO Ichanx=1,Ichan
-                        KL = KL + 1
-                        Ifs = If_Stay (Ichan, Ifdif, Nent, If_Excl(Ichan), Kaptur)
-                        IF (Ifs.EQ.0 .AND. Ichanx.LE.Nent) THEN
-                           Derivx(1,Ichanx,Ichan,Ifl) =     &
-                              Derivx(1,Ichanx,Ichan,Ifl) +  &
-                              calc%Pr(Ij,M)*Tx(1,Ij,KL) -   &
-                              calc%Pi(Ij,M)*Tx(2,Ij,KL)
-                           Derivx(2,Ichanx,Ichan,Ifl) =     &
-                              Derivx(2,Ichanx,Ichan,Ifl) +  &
-                              calc%Pr(Ij,M)*Tx(2,Ij,KL) +   &
-                              calc%Pi(Ij,M)*Tx(1,Ij,KL)
-                        END IF
-                     END DO
-                  END DO
-               END IF
-            END DO
          END DO
       END IF
       RETURN
-      END SUBROUTINE Dercap
+      END SUBROUTINE Derres
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Dereee (calc, Nent, If_Excl, Ifcros, Derivx, Tr, Ti,   &
-         Tx, Prer, Prei, Ddddtl, Ntot)
+      SUBROUTINE Dereee (spinInfo, calc, Igr)
 !
 ! *** generate Deriv(k,Itzero) & Deriv(k,Ilzero); ditto Derivx
 ! *** ie Deriv(k,i) = partial Crss(k) wrt either Tzero or LZero
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use varyr_common_m, only : Etz, Elz
+      use mxct09_m
+      use SammySpinGroupInfo_M
+      IMPLICIT None
 !
+      type(SammySpinGroupInfo):: spinInfo
       class(XctCrossCalc)::calc
-      DIMENSION If_Excl(*), Ifcros(*), Prer(Ntriag), Prei(Ntriag),  &
-         Derivx(2,Ntotc,Ntotc,*), Tr(Ncrsss,*), Ti(Ncrsss,*),       &
-         Tx(2,Ntriag,*), Ddddtl(*)
-!
-!  Napres -> all parameters for which derivatives are needed
-!            not restricted to resonance parameters
-!            only distantly related to the parameter of the same
-!            name that was in fixedi_m
+      logical::Ifs
+      integer::Igr
 !
-!      DIMENSION Ifcros(Ncrsss), Prer(Ntriag), Prei(Ntriag),
-!     *   Deriv(Ncrsss,Napres), Derivx(2,Ntotc,Ntotc,Nnpar),
-!     *   Tr(Ncrsss,Nn), Ti(Ncrsss,Nn), Tx(2,Ntriag,Ntriag),
-!     *   Ddddtl(Ncrsss)
 !
-      DATA Zero /0.0d0/
+      real(kind=8),parameter::Zero =0.0d0
+      integer::I, Ichan, Ichanx, Ij, Itz, Ilz, J, K, KL, Nent, Ntot, Ix
+      real(kind=8)::Zz, A1, A2, val
 !
-      Itz = Itzero
-      Ilz = IlZero
-      IF (Ncrssx.NE.0) THEN
+      Itz = calc%Itzero
+      Ilz = calc%IlZero
+      ntot = spinInfo%getNumChannels()
+      nent = spinInfo%getNumEntryChannels()
+
+      IF (any(calc%Ifcros)) THEN
 ! ***    Calculating Deriv(K,I?z) = (2T)(Pre)(Z)(E?z), where
 ! ***               Tr   + i Ti   = (partial sigmaX  wrt R) * Half
 ! ***               Prer + i Prei =  partial R       wrt E
-! ***               Z             =  partial E       wrt sqrt(E) = 2*Squ
+! ***               Z             =  partial E       wrt sqrt(E) = 2*sqrt(E)
 ! ***               Etz           =  partial sqrt(E) wrt  tzero
 ! ***               ELz           =  partial sqrt(E) wrt eLzero
 ! ***    but do not include the E?z part yet, or missing {dgoj * 1/E^2},
 ! ***    and store in Ddddtl
-         Zz = Squ*4.0D0
-         DO K=1,Ncrsss
-            Ddddtl(K) = Zero
-         END DO
+         Zz = calc%enerSq*4.0D0
+         calc%Ddddtl = Zero
          Ij = 0
-         DO I=1,Ntot
+         DO I=1, ntot
             DO J=1,I
                Ij = Ij + 1
-               IF (Prei(Ij).NE.Zero) THEN
-                  DO K=1,Ncrsss
-                     IF (Ifcros(K).NE.0) THEN
-                        IF (K.LE.2 .OR. If_Excl(K-2+Nent).EQ.0) THEN
-                           Ddddtl(K) = Ddddtl(K) - Prei(Ij)*Ti(K,Ij)*Zz
+               IF (calc%Prei(Ij, Igr).NE.Zero.or.calc%Prer(Ij, Igr).NE.Zero) THEN
+                  DO K=1,calc%Ntotc+1
+                     IF (calc%Ifcros(K)) THEN
+                        IF (wantChannelInCalc(calc, spinInfo, k, nent)) THEN
+                          calc%Ddddtl(K) = calc%Ddddtl(K) - calc%Prei(Ij, Igr)*calc%Ti(K,Ij)*Zz
+                          calc%Ddddtl(K) = calc%Ddddtl(K) + calc%Prer(Ij, Igr)*calc%Tr(K,Ij)*Zz
                         END IF
                      END IF
                   END DO
-               END IF
-               IF (Prer(Ij).NE.Zero) THEN
-                  DO K=1,Ncrsss
-                     IF (Ifcros(K).NE.0) THEN
-                        IF (K.LE.2 .OR. If_Excl(K-2+Nent).EQ.0) THEN
-                           Ddddtl(K) = Ddddtl(K) + Prer(Ij)*Tr(K,Ij)*Zz
-                        END IF
-                     END IF
-                  END DO
-               END IF
+               END IF              
             END DO
          END DO
       END IF
 !
 !
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
 ! ***    careful... i don't believe the following yet !!
-         DO Ij=1,NN
-            IF (PreI(Ij).NE.Zero .OR. PreR(Ij).NE.Zero) THEN
-               KL = 0
+         DO Ij=1,calc%ntriag
+            IF (calc%PreI(Ij, Igr).NE.Zero .OR. calc%PreR(Ij, Igr).NE.Zero) THEN
+               KL = 0               
                DO Ichan=1,Ntot
                   DO Ichanx=1,Ichan
                      KL = KL + 1
-                     Ifs = If_Stay (Ichan, Ifdif, Nent, If_Excl(Ichan), Kaptur)
-                     IF (Ifs.EQ.0 .AND. Ichanx.LE.Nent) THEN
-                        IF (Itz.GT.0) THEN
-                           Derivx(1,Ichanx,Ichan,Itz) =    &
-                              Derivx(1,Ichanx,Ichan,Itz) + &
-                              Prer(Ij)*Tx(1,Ij,KL) -       &
-                              Prei(Ij)*Tx(2,Ij,KL)*Etz
-                           Derivx(2,Ichanx,Ichan,Itz) =    &
-                              Derivx(2,Ichanx,Ichan,Itz) + &
-                              Prer(Ij)*Tx(2,Ij,KL) +       &
-                              Prei(Ij)*Tx(1,Ij,KL)*Etz
-                        END IF
-                        IF (iLz.GT.0) THEN
-                           Derivx(1,Ichanx,Ichan,iLz) =      &
-                              Derivx(1,Ichanx,Ichan,iLz) +   &
-                              Prer(Ij)*Tx(1,Ij,KL) -         &
-                              Prei(Ij)*Tx(2,Ij,KL)*Elz
-                           Derivx(2,Ichanx,Ichan,iLz) =      &
-                              Derivx(2,Ichanx,Ichan,iLz) +   &
-                              Prer(Ij)*Tx(2,Ij,KL) +         &
-                              Prei(Ij)*Tx(1,Ij,KL)*Elz
-                        END IF
+                     Ifs = calc%useChannel(Ichan,2)
+                     IF (Ifs  .AND. Ichanx.LE.Nent) THEN
+                        Do Ix = 1, 2
+                           select case(Ix)
+                              case(1)
+                                 A1 = calc%Prer(Ij, Igr)*calc%Tx(1,Ij,KL)
+                                 A2 = -calc%Prei(Ij, Igr)*calc%Tx(2,Ij,KL)
+                              case(2)
+                                 A1 = calc%Prer(Ij, Igr)*calc%Tx(2,Ij,KL)
+                                 A2 = calc%Prei(Ij, Igr)*calc%Tx(1,Ij,KL)
+                           end select
+                           IF (Itz.GT.0) THEN
+                             val = calc%angInternal(Ix,Ichanx,Ichan, Igr, Itz)
+                             val = val + A1 + A2*Etz
+                             calc%angInternal(Ix,Ichanx,Ichan, Igr, Itz) = val
+                           end if
+                           IF (iLz.GT.0) THEN
+                              val = calc%angInternal(Ix,Ichanx,Ichan, Igr, iLz)
+                              val = val + A1 + A2*Elz
+                              calc%angInternal(Ix,Ichanx,Ichan, Igr, iLz) = val
+                           end if
+                        end do
                      END IF
                   END DO
                END DO
diff --git a/sammy/src/xct/mxct12.f90 b/sammy/src/xct/mxct12.f90
index 0a01d87b0..f17343bc6 100644
--- a/sammy/src/xct/mxct12.f90
+++ b/sammy/src/xct/mxct12.f90
@@ -1,43 +1,47 @@
 module mxct12_m
 use XctCrossCalc_M
+implicit none
+private multiplyDerivx
 contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derext (calc, If_Excl, Ifcros, Deriv, Derivx,   &
-         Tr, Tx, Dgoj, Ntot, Nent, Krext)
+      SUBROUTINE Derext (spinInfo, calc, Igr)
 !
-      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)
+      use mxct09_m
 !
-      class(XctCrossCalc)::calc
-      DIMENSION If_Excl(*), Ifcros(*),   &
-         Deriv(Ncrsss,*),   &
-         Derivx(2,Ntotc,Ntotc,*), Tr(Ncrsss,*), Tx(2,Ntriag,*)
+       class(XctCrossCalc)::calc
+       type(SammySpinGroupInfo)::spinInfo
+
        type(SammyRExternalInfo)::rextInfo
        real(kind=8)::Parext(7)
        type(RExternalFunction)::rext
-!      DIMENSION If_Excl(*), Ifcros(Ncrsss),
-!     *   Deriv(Ncrsss,Ndasig+ndbsig),
-!     *   Derivx(2,Ntotc,Ntotc,nap), Tr(Ncrsss,Nn), Tx(2,Ntriag,Ntriag)
-!
-       DATA Two /2.0d0/
+       integer::Igr, Jstart, Nrext
+       logical::rextVaried
+
+       real(kind=8),parameter:: Two = 2.0d0
+       real(kind=8)::A, Dgoj, val, Su
+       integer::I, Ichan, J, Kl, M, Nchan, Nchanx, Nent, Ntot, Ij
 !
 !
-      IF (Ncrsss.NE.0) THEN
+
+      Ntot = spinInfo%getNumChannels()
+      Nent = spinInfo%getNumEntryChannels()
+      Dgoj = spinInfo%getGFactor()
+      Su = dAbs(calc%ener)
+      rextVaried = .false.
+      IF (any(calc%Ifcros)) THEN
          Ij = 0
          DO I=1,Ntot
             Ij = Ij + I
           Parext = 0.0d0
-          IF (resparData%hasRexInfo(Nnnn, I)) THEN
-            call resparData%getRextInfoByGroup(rextInfo, Nnnn, I)
-            call resParData%getRext(rext, rextInfo)
+          IF (calc%resData%hasRexInfo(Igr, I)) THEN
+            call calc%resData%getRextInfoByGroup(rextInfo, Igr, I)
+            nrext = rextInfo%getNrext()
+            call calc%resData%getRext(rext, rextInfo)
             DO J = 1, rextInfo%getNrext()
               Parext(J) = rext%getSammyValue(J)
             end do
@@ -45,86 +49,102 @@ contains
 ! ***          ergo need to multiply by 2 here
             A = Two*Dgoj
             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))/   &
+               rextVaried = .true.
+               Jstart = rextInfo%getIflSammyIndex(1)
+               DO M=1,calc%ntotc+1
+                  IF (calc%useChannel(M,1)) THEN
+                     val = 0.0d0
+                     IF (Nrext.EQ.5) then
+                        val  =   -calc%Tr(M,Ij)*A*(Parext(5))/   &
                                  (Su-Parext(1))
-                     IF (Nrext.EQ.7) Deriv(M,Jstart) = - Tr(M,Ij)*A*    &
-                        (Parext(5)+   &
-                         Parext(6)*Parext(1))   &
-                                    / (Su-Parext(1))
+                     else if (Nrext.EQ.7)  then
+                       val = - calc%Tr(M,Ij)*A* (Parext(5)+  Parext(6)*Parext(1))/  &
+                                     (Su-Parext(1))
+                     end if
+                     val = val + calc%crossInternal(M, Igr, Jstart)
+                     calc%crossInternal(M, Igr, Jstart) = val
                   END IF
                END DO
             END IF
             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))/   &
+               rextVaried = .true.
+               Jstart = rextInfo%getIflSammyIndex(2)
+               DO M=1,calc%ntotc+1
+                  IF (calc%useChannel(M,1) ) THEN
+                     val = 0.0d0
+                     IF (Nrext.EQ.5) then
+                         val  =  - calc%Tr(M,Ij)*A*(Parext(5))/   &
                                      (Parext(2)-Su)
-                     IF (Nrext.EQ.7) Deriv(M,Jstart) = - Tr(M,Ij)*A*    &
-                        (Parext(5)+   &
-                         Parext(6)*Parext(2))   &
-                                       / (Parext(2)-Su)
+                     else if (Nrext.EQ.7) then
+                        val = - calc%Tr(M,Ij)*A*  (Parext(5)+ Parext(6)*Parext(2))/  &
+                                (Parext(2)-Su)
+                     end if
+                     val = val + calc%crossInternal(M, Igr, Jstart)
+                     calc%crossInternal(M, Igr, Jstart) = val
                   END IF
                END DO
             END IF
             IF (rextInfo%getIflSammyIndex(3).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
+               rextVaried = .true.
+               Jstart = rextInfo%getIflSammyIndex(3)
+               DO M=1,calc%ntotc+1
+                  IF (calc%useChannel(M,1)) THEN
+                     val = calc%Tr(M,Ij)*A
+                     val = val + calc%crossInternal(M, Igr, Jstart)
+                     calc%crossInternal(M, Igr, Jstart) = val
                   END IF
                END DO
             END IF
             IF (rextInfo%getIflSammyIndex(4).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*Su
+               rextVaried = .true.
+               Jstart = rextInfo%getIflSammyIndex(4)
+               DO M=1,calc%ntotc+1
+                  IF (calc%useChannel(M,1)) THEN
+                     val = calc%Tr(M,Ij)*A*Su
+                     val = val + calc%crossInternal(M, Igr, Jstart)
+                     calc%crossInternal(M, Igr, Jstart) = val
                   END IF
                END DO
             END IF
             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)*   &
+               rextVaried = .true.
+               Jstart = rextInfo%getIflSammyIndex(5)
+               DO M=1,calc%ntotc+1
+                  IF (calc%useChannel(M,1) ) THEN
+                     val = -2.0D0*calc%Tr(M,Ij)*   &
                      A*dSQRT(Parext(5))*   &
                         dLOG( (Parext(2)-Su)/   &
                            (Su-Parext(1)) )
 ! ***                Remember that the u-parameter is the
 ! ***                   square root of Parext(5)
+                     val = val + calc%crossInternal(M, Igr, Jstart)
+                     calc%crossInternal(M, Igr, Jstart) = val
                   END IF
                END DO
             END IF
             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*   &
+                  rextVaried = .true.
+                  Jstart = rextInfo%getIflSammyIndex(6)
+                  DO M=1,calc%ntotc+1
+                     IF (calc%useChannel(M,1) ) THEN
+                        val = - calc%Tr(M,Ij)*A*   &
                            ( (Parext(2)-Parext(1)) +   &
                            Su*dLOG( (Parext(2)-Su)/   &
                                  (Su-Parext(1)) ) )
+                       val = val + calc%crossInternal(M, Igr, Jstart)
+                       calc%crossInternal(M, Igr, Jstart) = val
                      END IF
                   END DO
                END IF
                IF (rextInfo%getIflSammyIndex(7).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*Su**2
+                  rextVaried = .true.
+                  Jstart = rextInfo%getIflSammyIndex(7)
+                  DO M=1,calc%ntotc+1
+                     IF (calc%useChannel(M,1)) THEN
+                        val = calc%Tr(M,Ij)*A*Su**2
+                        val = val + calc%crossInternal(M, Igr, Jstart)
+                        calc%crossInternal(M, Igr, Jstart) = val
                      END IF
                   END DO
                END IF
@@ -135,31 +155,28 @@ contains
 !
 !
 !
-      IF (Ifdif.NE.0) THEN
-         Jstartx = Jstart
+      IF (calc%needAngular.and.rextVaried) THEN
          Ij = 0
          DO Ichan=1,Ntot
-            Ij = Ij + Ichan
-            Jstart = Jstartx
+            Ij = Ij + Ichan         
             DO Nchan=1,Ntot
                Parext = 0.0d0
-               IF (If_Stay (Nchan, Ifdif, Nent, If_Excl(Nchan), Kaptur)   &
-                  .EQ.0) THEN
+               IF (calc%useChannel(Nchan,2)) THEN
                   DO Nchanx=1,Nent
                      IF (Nchanx.LE.Nchan) THEN
                         Kl = (Nchan*(Nchan-1))/2 + Nchanx
                      ELSE
                         Kl = (Nchanx*(Nchanx-1))/2 + Nchan
                      END IF
-                     IF (resparData%hasRexInfo(Nnnn, Ichan)) THEN
-                        call resparData%getRextInfoByGroup(rextInfo,   &
-                                     Nnnn, Ichan)
-                        call resParData%getRext(rext, rextInfo)
+                     IF (calc%resData%hasRexInfo(Igr, Ichan)) THEN
+                        call calc%resData%getRextInfoByGroup(rextInfo,   &
+                                     Igr, Ichan)
+                        call calc%resData%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
+                           Jstart = rextInfo%getIflSammyIndex(1)
                            IF (Nrext.EQ.5) THEN
                               A = -Parext(5)/   &
                                    (Su-Parext(1))
@@ -169,13 +186,10 @@ contains
                                  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)
+                           call multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, A)
                         END IF
                         IF (rextInfo%getIflSammyIndex(2).NE.0) THEN
-                           Jstart = Jstart + 1
+                           Jstart = rextInfo%getIflSammyIndex(2)
                            IF (Nrext.EQ.5) THEN
                               A = - Parext(5)/   &
                                    (Parext(2)-Su)
@@ -185,60 +199,36 @@ contains
                                  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)
+                           call multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, A)
                         END IF
                         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)
+                           Jstart = rextInfo%getIflSammyIndex(3)
+                           call multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, 1.0d0)
                         END IF
                         IF (rextInfo%getIflSammyIndex(4).NE.0) THEN
-                           Jstart = Jstart + 1
-                           Derivx(1,Nchanx,Nchan,Jstart) =   &
-                              Tx(1,Ij,KL)*Su +   &
-                              Derivx(1,Nchanx,Nchan,Jstart)
-                           Derivx(2,Nchanx,Nchan,Jstart) =   &
-                              Tx(2,Ij,KL)*Su +   &
-                              Derivx(2,Nchanx,Nchan,Jstart)
+                           Jstart = rextInfo%getIflSammyIndex(4)
+                           call multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, Su)
                         END IF
                         IF (rextInfo%getIflSammyIndex(5).NE.0) THEN
-                           Jstart = Jstart + 1
+                           Jstart = rextInfo%getIflSammyIndex(5)
                            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)
+                           call multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, A)
                         END IF
                         IF (rextInfo%getNrext().GT.5) THEN
                            IF (rextInfo%getIflSammyIndex(6).NE.0) THEN
-                              Jstart = Jstart + 1
+                              Jstart = rextInfo%getIflSammyIndex(6)
                               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)
-                              Derivx(2,Nchanx,Nchan,Jstart) =   &
-                                 Tx(2,Ij,KL)*A   &
-                                 + Derivx(2,Nchanx,Nchan,Jstart)
+                              call multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, A)
                            END IF
                            IF (rextInfo%getIflSammyIndex(7).NE.0) THEN
-                              Jstart = Jstart + 1
+                              Jstart = rextInfo%getIflSammyIndex(7)
                               A = Su**2
-                              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)
+                              call multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, A)
                            END IF
                         END IF
                      END IF
@@ -250,4 +240,18 @@ contains
 !
       RETURN
       END
+
+      subroutine multiplyDerivx(calc, Igr, Nchanx,Nchan,Ij, Kl, Jstart, A)
+      class(XctCrossCalc)::calc
+      integer::igr
+      integer:: Nchanx,Nchan,Ij, Kl, Jstart
+      real(kind=8)::A
+      integer::ix
+
+      do ix = 1, 2
+         calc%angInternal(Ix,Nchanx,Nchan, Igr, Jstart) =   &
+            calc%Tx(Ix,Ij,KL)*A   &
+            + calc%angInternal(Ix,Nchanx,Nchan, Igr, Jstart)
+      end do
+      end subroutine multiplyDerivx
 end module mxct12_m
diff --git a/sammy/src/xct/mxct13.f90 b/sammy/src/xct/mxct13.f90
index 5bc5a6254..cc9f09c8d 100644
--- a/sammy/src/xct/mxct13.f90
+++ b/sammy/src/xct/mxct13.f90
@@ -1,56 +1,56 @@
+module mxct13_m
+use XctCrossCalc_M
+contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Setpxr (Rootp, Xxxxr, Xxxxi, Dpdr, Dsdr, Pxrhor,   &
-         Pxrhoi, Ntot)
+      SUBROUTINE Setpxr (calc,  Ntot)
 !
 ! *** purpose -- generate Pxrho_ = partial(Xxxx_) wrt (Rho)
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct09_m
+      IMPLICIT none
 !
 !
-      DIMENSION Rootp(*), Xxxxr(*), Xxxxi(*), Dpdr(*), Dsdr(*),   &
-         Pxrhor(Nn,*), Pxrhoi(Nn,*)
-!      DIMENSION Rootp(Ntot), Xxxxr(Nn), Xxxxi(Nn), Dpdr(Ntot), Dsdr(Ntot),
-!     *   Pxrhor(Nn,Ntotc), Pxrhoi(Nn,Ntotc)
+      class(XctCrossCalc)::calc
+      integer::ntot
+      real(kind=8)::Ai, Ar, Bi, Br, Dpopi, Dpopj
+      integer::I, Ij, Ik, J, Kj, K
 !
-      EXTERNAL Ijkl
-      DATA Zero /0.0d0/, Half /0.5d0/
+      real(kind=8),parameter:: Zero = 0.0d0, Half = 0.5d0
 !
-      CALL Zero_Array (Pxrhor, Nn*Ntotc)
-      CALL Zero_Array (Pxrhoi, Nn*Ntotc)
 !
+      calc%Pxrhor = 0.0d0
+      calc%Pxrhoi = 0.0d0
+
       Ij = 0
       DO I=1,Ntot
-         Dpopi = Dpdr(I)*Half/Rootp(I)**2
+         Dpopi = calc%Dpdr(I)*Half/calc%Rootp(I)**2
 ! ***          = [ partial ( sqrt(P)) wrt rho ]  /  sqrt(P)
          DO J=1,I
             Ij = Ij + 1
             IF (Dpopi.NE.Zero) THEN
-               Pxrhor(Ij,I) = Pxrhor(Ij,I) + Xxxxr(Ij)*Dpopi
-               Pxrhoi(Ij,I) = Pxrhoi(Ij,I) + Xxxxi(Ij)*Dpopi
+               calc%Pxrhor(Ij,I) = calc%Pxrhor(Ij,I) + calc%Xxxxr(Ij)*Dpopi
+               calc%Pxrhoi(Ij,I) = calc%Pxrhoi(Ij,I) + calc%Xxxxi(Ij)*Dpopi
             END IF
-            IF (Dpdr(J).NE.Zero) THEN
-               Dpopj = Dpdr(J)*Half/Rootp(J)**2
-               Pxrhor(Ij,J) = Pxrhor(Ij,J) + Xxxxr(Ij)*Dpopj
-               Pxrhoi(Ij,J) = Pxrhoi(Ij,J) + Xxxxi(Ij)*Dpopj
+            IF (calc%Dpdr(J).NE.Zero) THEN
+               Dpopj = calc%Dpdr(J)*Half/calc%Rootp(J)**2
+               calc%Pxrhor(Ij,J) = calc%Pxrhor(Ij,J) + calc%Xxxxr(Ij)*Dpopj
+               calc%Pxrhoi(Ij,J) = calc%Pxrhoi(Ij,J) + calc%Xxxxi(Ij)*Dpopj
             END IF
             DO K=1,Ntot
-               IF (Dsdr(K).NE.Zero .OR. Dpdr(K).NE.Zero) THEN
+               IF (calc%Dsdr(K).NE.Zero .OR. calc%Dpdr(K).NE.Zero) THEN
                   Ik = Ijkl(I,K)
                   Kj = Ijkl(K,J)
-                  Ar = Xxxxr(Ik)/Rootp(K)
-                  Ai = Xxxxi(Ik)/Rootp(K)
-                  Br = Ar*Dsdr(K) - Ai*Dpdr(K)
-                  Bi = Ai*Dsdr(K) + Ar*Dpdr(K)
-                  Ar = Xxxxr(Kj)/Rootp(K)
-                  Ai = Xxxxi(Kj)/Rootp(K)
-                  Pxrhor(Ij,k) = Pxrhor(Ij,k) + Ar*Br - Ai*Bi
-                  Pxrhoi(Ij,k) = Pxrhoi(Ij,k) + Ar*Bi + Ai*Br
+                  Ar = calc%Xxxxr(Ik)/calc%Rootp(K)
+                  Ai = calc%Xxxxi(Ik)/calc%Rootp(K)
+                  Br = Ar*calc%Dsdr(K) - Ai*calc%Dpdr(K)
+                  Bi = Ai*calc%Dsdr(K) + Ar*calc%Dpdr(K)
+                  Ar = calc%Xxxxr(Kj)/calc%Rootp(K)
+                  Ai = calc%Xxxxi(Kj)/calc%Rootp(K)
+                  calc%Pxrhor(Ij,k) = calc%Pxrhor(Ij,k) + Ar*Br - Ai*Bi
+                  calc%Pxrhoi(Ij,k) = calc%Pxrhoi(Ij,k) + Ar*Bi + Ai*Br
                END IF
             END DO
          END DO
@@ -58,3 +58,4 @@
 !
       RETURN
       END
+end module mxct13_m
diff --git a/sammy/src/xct/mxct14.f90 b/sammy/src/xct/mxct14.f90
index f8c7a877b..160805a28 100644
--- a/sammy/src/xct/mxct14.f90
+++ b/sammy/src/xct/mxct14.f90
@@ -1,11 +1,6 @@
 module Derrho_m
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      use SammySpinGroupInfo_M
-      use SammyChannelInfo_M
-      use EndfData_common_m, only : radFitFlags
-      IMPLICIT NONE
+use XctCrossCalc_M
+IMPLICIT NONE
 
 contains      
 
@@ -13,9 +8,7 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derrho (spinInfo, Ifcros, Zke, Sinsqr,   &
-        Sin2ph, Cscs, Dphi, Xxxxr, Xxxxi, Pxrhor, Pxrhoi, Dsf, Dst, & 
-        Dstt, Dsfx, Dstx, Nnext, Lrmat)
+      SUBROUTINE Derrho (spinInfo, calc, Igr, Lrmat)
 !
 ! *** generate derivatives of Crss & Crssx wrt rho
 ! *** Dsf (   I) = Deriv of Crss(1   ) wrt rho via phi(I)
@@ -24,54 +17,46 @@ contains
 !
 !
 !
+      use mxct09_m
+      use SammySpinGroupInfo_M
+      use SammyChannelInfo_M
+      class(XctCrossCalc)::calc
       type(SammySpinGroupInfo)::spinInfo
-      type(SammyChannelInfo)::channelInfo
-      real(kind=8):: Zke(*), Sinsqr(*), Sin2ph(*),                       &
-         Cscs(2,*), Dphi(*), Xxxxr(*), Xxxxi(*), Pxrhor(nn,*),           & 
-         Pxrhoi(Nn,*), Dsf(*), Dst(2,*), Dstt(Nnext,*), Dstx(2,Ntotc,*), &
-         Dsfx(2,Ntotc,*)
-      INTEGER::Ifcros(*)
+      type(SammyChannelInfo)::channelInfo      
 
-      integer::  nnext, lrmat
+      integer::  lrmat
 
       real(kind=8)::half, one, two, four, zero
       real(kind=8):: a, Aa, suma, sumb, Zz
       integer::i, ichan, ifc, ii, ij, m, jchan, j, Jj, mchan
-      integer::chanExcl, igr
-      logical::iflApe, iflApt
-!      DIMENSION  Ifcros(Ncrsss), Zke(Ntot), Sinsqr(Ntot),
-!     *   Sin2ph(Ntot), Cscs(2,Ntriag), Dphi(Ntot), Xxxxr(Nn), Xxxxi(Nn),
-!     *   Pxrhor(Nn,Ntot), Pxrhoi(Nn,Ntot), Dsf(Ntot), Dst(2,Ntot),
-      !     *   Dstt(Next,Nent), Dstx(2,Ntotc,Ntotc), Dsfx(2,Ntotc,Ntotc)
-      integer::Ijkl
-      EXTERNAL Ijkl
+      integer::igr
+      logical::iflApe, iflApt, elastic
+
       DATA Half /0.5d0/, One /1.0d0/, Two /2.0d0/, Four /4.0d0/
       DATA Zero /0.0d0/
 
-
       iflApe = .false.
       iflApt = .false.
-      igr = spinInfo%getSpinGroupIndex()
       DO I=1, spinInfo%getNumChannels()
-        if (radFitFlags%getTrueFitFlag(igr, I).ne.0) iflApt = .true.
-        if (radFitFlags%getEffFitFlag(igr, I).ne.0) iflApe = .true.
+        if (calc%radiusData%getTrueFitFlag(igr, I).ne.0) iflApt = .true.
+        if (calc%radiusData%getEffFitFlag(igr, I).ne.0) iflApe = .true.
       end Do
 !
 !
-      IF (Ncrssx.EQ.1) THEN
+      IF (any(calc%Ifcros)) THEN
 ! ***    (Ncrssx=1 if some of Crss need to be calculated; otherwise
 ! ***     Ncrssx=0)
 !
-         IF (iflApe.OR. Ktzero.GT.0) THEN
-            IF (Ifcros(1).NE.0) THEN
+         IF (iflApe.OR. calc%Ifzzz) THEN
+            IF (calc%Ifcros(1)) THEN
 ! ***          [partial of elastic cross section wrt phi] * 
 ! ***          [partial of phi wrt rho]
                Ii = 0
                DO I=1,spinInfo%getNumEntryChannels()
                   Ii = Ii + I
-                  Dsf(I) = ( Sin2ph(I)*(One-Two*Xxxxi(Ii))   &
-                    - Four*(Half-Sinsqr(I))*Xxxxr(Ii) ) *    &
-                                       Dphi(I) /Zke(I)**2
+                  calc%Dsf(I) = ( calc%Sin2ph(I)*(One-Two*calc%Xxxxi(Ii))   &
+                    - Four*(Half-calc%Sinsqr(I))*calc%Xxxxr(Ii) ) *    &
+                                       calc%Dphi(I) /calc%Zke(I, Igr)**2
                END DO
 ! ***          Note that the "f" in Dsf is for "effective" rho... ie
 ! ***             effective radius
@@ -79,8 +64,8 @@ contains
          END IF
 !
          IF  (Lrmat.EQ.0) THEN
-            IF (iflApt.OR. Ktzero.GT.0) THEN
-               IF (Ifcros(1).NE.0 .OR. Ifcros(2).NE.0) THEN
+            IF (iflApt.OR.  calc%Ifzzz) THEN
+               IF (calc%Ifcros(1).OR. calc%Ifcros(2)) THEN
 ! ***             [partial derivatives of elastic and absorption cross
 ! ***                 sections wrt Xxxx] * [partial of Xxxx wrt rho_m]
                   DO M=1,spinInfo%getNumChannels()
@@ -88,21 +73,21 @@ contains
                      Ij = 0
                      DO I=1,spinInfo%getNumEntryChannels()
                         Ii = Ii + I
-                        Zz = Zke(I)**2
-                        Sumb = - Two*Sinsqr(I)*Pxrhoi(Ii,M) -  &
-                                     Sin2ph(I)*Pxrhor(Ii,M)
+                        Zz = calc%Zke(I, Igr)**2
+                        Sumb = - Two*calc%Sinsqr(I)*calc%Pxrhoi(Ii,M) -  &
+                                     calc%Sin2ph(I)*calc%Pxrhor(Ii,M)
                         Sumb = Sumb / Zz
-                        Suma = Pxrhoi(Ii,M) / Zz
+                        Suma = calc%Pxrhoi(Ii,M) / Zz
                         DO J=1,I
                            Ij = Ij + 1
-                           A = Two* ( Xxxxr(Ij)*Pxrhor(Ij,M) +  &
-                                      Xxxxi(Ij)*Pxrhoi(Ij,M) )
+                           A = Two* ( calc%Xxxxr(Ij)*calc%Pxrhor(Ij,M) +  &
+                                      calc%Xxxxi(Ij)*calc%Pxrhoi(Ij,M) )
                            IF (I.NE.J) A = A + A
                            Sumb = Sumb + A/Zz
                            Suma = Suma - A/Zz
                         END DO
-                        IF (Ifcros(1).NE.0) Dst(1,M) = Sumb
-                        IF (Ifcros(2).NE.0) Dst(2,M) = Suma
+                        IF (calc%Ifcros(1)) calc%Dst(1,M) = Sumb
+                        IF (calc%Ifcros(2)) calc%Dst(2,M) = Suma
                      END DO
                   END DO
                END IF
@@ -114,35 +99,31 @@ contains
 ! ***                scattering) wrt Xxxx] * [partial Xxxx wrt rho_m]
                   Ifc = 0
                   DO Jj=1,spinInfo%getNumExitChannels()
-                     IF (Ifcros(Jj+2).NE.0) Ifc = 1
+                     IF (calc%Ifcros(Jj+2)) Ifc = 1
                   END DO
                   IF (Ifc.NE.0) THEN
-                     DO M=1,spinInfo%getNumChannels()
-                        DO Jj=1,spinInfo%getNumExitChannels()
-                           Dstt(Jj,M) = Zero
-                        END DO
+                     calc%Dstt = Zero
+                     DO M=1,spinInfo%getNumChannels()                        
                         DO I=1,spinInfo%getNumEntryChannels()
-                           Zz = Zke(i)**2
+                           Zz = calc%Zke(i, Igr)**2
                            DO Jj=1,spinInfo%getNumExitChannels()
                               if((Jj+spinInfo%getNumEntryChannels()).gt.spinInfo%getNumChannels()) cycle
-                              if ( Ifcros(Jj+2).eq.0) cycle
+                              if ( .not.calc%Ifcros(Jj+2)) cycle
                               call spinInfo%getChannelInfo(channelInfo, Jj+spinInfo%getNumEntryChannels())
 
                               
-                               if ( channelInfo%getExcludeCompletely()) then
-                                 chanExcl =  -1
-                               else if (channelInfo%getIncludeInCalc()) then
-                                  chanExcl  = 0
+                               if ( channelInfo%getExcludeCompletely()) cycle
+                               if ( channelInfo%getIncludeInCalc()) then
+                                 if (calc%addElimKapt) cycle
                                else
-                                  chanExcl = 1
+                                  if (.not.calc%addElimKapt) cycle
                                end if
-                               if (chanExcl.ne.Kaptur) cycle
-                               
+
                                J = Jj + spinInfo%getNumEntryChannels()
                                Ij = Ijkl(I,J)
-                               A = Two * (Xxxxr(Ij)*Pxrhor(Ij,M)+    &
-                                          Xxxxi(Ij)*Pxrhoi(Ij,M))
-                               Dstt(Jj,M) = A/Zz + Dstt(Jj,M)
+                               A = Two * (calc%Xxxxr(Ij)*calc%Pxrhor(Ij,M)+    &
+                                          calc%Xxxxi(Ij)*calc%Pxrhoi(Ij,M))
+                               calc%Dstt(Jj,M) = A/Zz + calc%Dstt(Jj,M)
                            END DO
                         END DO
                      END DO
@@ -154,55 +135,48 @@ contains
       END IF
 !
 !
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
+         elastic = calc%reactType.ne.11
 !
-         IF (iflApe.OR. Ktzero.GT.0) THEN
+         IF (iflApe.OR.  calc%Ifzzz) THEN
 ! ***       [partial of pieces of angular distribution wrt phi]
 ! ***                                        * [partial phi wrt rho]
-            CALL Zero_Array (Dstx, 2*Ntotc**2)
-            CALL Zero_Array (Dsfx, 2*Ntotc**2)
+            calc%Dstx = 0.0d0
+            calc%Dsfx = 0.0d0
 !
-            IF (Ifdif.EQ.1) THEN
+            IF (elastic) THEN
 ! ***          First, diagonal pieces
                II = 0
                DO Ichan=1,spinInfo%getNumEntryChannels()
-                  Zz = Zke(Ichan)**2
+                  Zz = calc%Zke(Ichan, Igr)**2
                   II = II + Ichan
-                  A  = ( Sin2ph(Ichan)*(One-Two*Xxxxi(II)) - Four*     &
-                       (Half-Sinsqr(Ichan))*Xxxxr(II) ) * Dphi(Ichan)
-                  Aa = ( (One-Two*Sinsqr(Ichan))*(One-Two*Xxxxi(II))   &
-                     - Two*Sin2ph(Ichan)*Xxxxr(II) ) * Dphi(Ichan)
-                  Dsfx(1,Ichan,Ichan) = A/Zz
-                  Dsfx(2,Ichan,Ichan) = Aa/Zz
+                  A  = ( calc%Sin2ph(Ichan)*(One-Two*calc%Xxxxi(II)) - Four*     &
+                       (Half-calc%Sinsqr(Ichan))*calc%Xxxxr(II) ) * calc%Dphi(Ichan)
+                  Aa = ( (One-Two*calc%Sinsqr(Ichan))*(One-Two*calc%Xxxxi(II))   &
+                     - Two*calc%Sin2ph(Ichan)*calc%Xxxxr(II) ) * calc%Dphi(Ichan)
+                  calc%Dsfx(1,Ichan,Ichan) = A/Zz
+                  calc%Dsfx(2,Ichan,Ichan) = Aa/Zz
                END DO
             END IF
 ! ***       off-diagonal pieces
             Ij = 0
             DO Ichan=1,spinInfo%getNumChannels()
-               Zz = Zke(Ichan)**2
+               Zz = calc%Zke(Ichan, Igr)**2
                DO Jchan=1,Ichan
                   Ij = Ij + 1
                  
                   IF (Jchan.LE.spinInfo%getNumEntryChannels() .AND. Jchan.NE.Ichan) THEN
                      
                      call spinInfo%getChannelInfo(channelInfo, Ichan)                     
-                     if ( channelInfo%getExcludeCompletely()) then
-                        chanExcl =  -1
-                     else if (channelInfo%getIncludeInCalc()) then
-                        chanExcl  = 0
-                     else
-                        chanExcl = 1
-                     end if
-                     
-                     IF ( (Ifdif.EQ.1 .AND. Ichan.LE.spinInfo%getNumEntryChannels()) .OR.   &
-                          (Ifdif.EQ.2 .AND. Ichan.GT.spinInfo%getNumEntryChannels() .AND.   &
-                           chanExcl.EQ.Kaptur) ) THEN
-                        A  = ( -Cscs(2,Ij)*Xxxxi(Ij)               &
-                           - Cscs(1,Ij)*Xxxxr(Ij) ) * Dphi(Ichan)
-                        AA = ( Cscs(2,Ij)*Xxxxr(Ij)                &
-                           - Cscs(1,Ij)*Xxxxi(Ij) ) * Dphi(Ichan)
-                        Dsfx(1,Jchan,Ichan) = A /Zz +Dsfx(1,Jchan,Ichan)
-                        Dsfx(2,Jchan,Ichan) = Aa/Zz +Dsfx(2,Jchan,Ichan)
+                     if ( channelInfo%getExcludeCompletely())  cycle
+
+                     IF ( calc%useChannel(Ichan ,2) ) THEN
+                        A  = ( -calc%Cscs(2,Ij)*calc%Xxxxi(Ij)               &
+                           - calc%Cscs(1,Ij)*calc%Xxxxr(Ij) ) * calc%Dphi(Ichan)
+                        AA = ( calc%Cscs(2,Ij)*calc%Xxxxr(Ij)                &
+                           - calc%Cscs(1,Ij)*calc%Xxxxi(Ij) ) * calc%Dphi(Ichan)
+                        calc%Dsfx(1,Jchan,Ichan) = A /Zz +calc%Dsfx(1,Jchan,Ichan)
+                        calc%Dsfx(2,Jchan,Ichan) = Aa/Zz +calc%Dsfx(2,Jchan,Ichan)
 !c Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz these are probably not right... cuz wrt
 !c Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz    which variable?
                      END IF
@@ -211,46 +185,38 @@ contains
             END DO
          END IF
 !
-         IF (iflApt.OR. Ktzero.GT.0) THEN
+         IF (iflApt.OR.  calc%Ifzzz) THEN
 ! ***       [partial derivatives of diff cross section wrt XXXX] *
 !c ***                                      [partial XXX wrt rho]
             DO Mchan=1,spinInfo%getNumChannels()
                Ii = 0
                Ij = 0
                DO Ichan=1,spinInfo%getNumChannels()
-                  Zz = Zke(Ichan)**2
+                  Zz = calc%Zke(Ichan, Igr)**2
                   Ii = Ii + Ichan
-                  IF (Ifdif.EQ.1 .AND. Ichan.LE.spinInfo%getNumEntryChannels()) THEN
-                     A  = - Two*Sinsqr(Ichan)*Pxrhoi(Ii,Mchan) -    &
-                                Sin2ph(Ichan)*Pxrhor(Ii,Mchan)
-                     AA = (Two*Sinsqr(Ichan)-One)*Pxrhor(Ii,Mchan) +  &
-                               Sin2ph(Ichan)*Pxrhoi(Ii,Mchan)
-                     Dstx(1,Ichan,Ichan) = Dstx(1,Ichan,Ichan) + A /Zz
-                     Dstx(2,Ichan,Ichan) = Dstx(2,Ichan,Ichan) + Aa/Zz
+                  IF (elastic .AND. Ichan.LE.spinInfo%getNumEntryChannels()) THEN
+                     A  = - Two*calc%Sinsqr(Ichan)*calc%Pxrhoi(Ii,Mchan) -    &
+                                calc%Sin2ph(Ichan)*calc%Pxrhor(Ii,Mchan)
+                     AA = (Two*calc%Sinsqr(Ichan)-One)*calc%Pxrhor(Ii,Mchan) +  &
+                               calc%Sin2ph(Ichan)*calc%Pxrhoi(Ii,Mchan)
+                     calc%Dstx(1,Ichan,Ichan) = calc%Dstx(1,Ichan,Ichan) + A /Zz
+                     calc%Dstx(2,Ichan,Ichan) = calc%Dstx(2,Ichan,Ichan) + Aa/Zz
                   END IF
                   DO Jchan=1,Ichan
                      Ij = Ij + 1
                      
                      call spinInfo%getChannelInfo(channelInfo, Ichan)                     
-                     if ( channelInfo%getExcludeCompletely()) then
-                        chanExcl =  -1
-                     else if (channelInfo%getIncludeInCalc()) then
-                        chanExcl  = 0
-                     else
-                        chanExcl = 1
-                     end if
+                     if ( channelInfo%getExcludeCompletely()) cycle
                      
                      IF (Jchan.NE.Ichan .AND. Jchan.LE.spinInfo%getNumEntryChannels()) THEN
-                        IF ( (Ifdif.EQ.1 .AND. Ichan.LE.spinInfo%getNumEntryChannels()) .OR.   &
-                             (Ifdif.EQ.2 .AND. Ichan.GT.spinInfo%getNumEntryChannels() .AND.   &
-                              chanExcl.EQ.Kaptur) ) THEN
-                           A = Cscs(1,Ij)*Pxrhoi(Ij,Mchan) -    &
-                               Cscs(2,Ij)*Pxrhor(Ij,Mchan)
-                           AA=-Cscs(1,Ij)*Pxrhor(Ij,Mchan) -    &
-                              Cscs(2,Ij)*Pxrhoi(Ij,Mchan)
-                           Dstx(1,Jchan,Ichan) = Dstx(1,Jchan,Ichan) +   &
+                        IF ( calc%useChannel(Ichan, 2)) THEN
+                           A = calc%Cscs(1,Ij)*calc%Pxrhoi(Ij,Mchan) -    &
+                               calc%Cscs(2,Ij)*calc%Pxrhor(Ij,Mchan)
+                           AA=-calc%Cscs(1,Ij)*calc%Pxrhor(Ij,Mchan) -    &
+                              calc%Cscs(2,Ij)*calc%Pxrhoi(Ij,Mchan)
+                           calc%Dstx(1,Jchan,Ichan) = calc%Dstx(1,Jchan,Ichan) +   &
                               A/Zz
-                           Dstx(2,Jchan,Ichan) = Dstx(2,Jchan,Ichan) +  &
+                           calc%Dstx(2,Jchan,Ichan) = calc%Dstx(2,Jchan,Ichan) +  &
                               Aa/Zz
 !czzzzzzzzzzzzzzzzzzzzzzzzzzzzzz these are not right yet!
                         END IF
diff --git a/sammy/src/xct/mxct15.f90 b/sammy/src/xct/mxct15.f90
index 9a5e627fe..da4d6c4bb 100644
--- a/sammy/src/xct/mxct15.f90
+++ b/sammy/src/xct/mxct15.f90
@@ -1,73 +1,69 @@
+module mxc15_m
+use XctCrossCalc_M
+implicit none
+contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derrad (Echan, If_Excl, Ifcros, Zke,   &
-         Deriv, Derivx, Dsf, Dst, Dstt, Dsfx,   &
-         Dstx, Dgoj, Nnext, Lrmat, igr)
+      SUBROUTINE Derrad (spinInfo, calc, Igr, Lrmat)
 !
 ! *** generate derivatives of cross section wrt radius
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      use EndfData_common_m, only : resparData, radFitFlags
       use SammySpinGroupInfo_M
       use SammyChannelInfo_M
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
 !
       logical::iflApe, iflApt
+      class(XctCrossCalc)::calc
       type(SammySpinGroupInfo)::spinInfo
-      DIMENSION Echan(*), If_Excl(*), Ifcros(*), Zke(*),   &
-         Deriv(Ncrsss,*), Derivx(2,Ntotc,Ntotc,*), Dsf(*),   &
-         Dst(2,*), Dstt(Nnext,*), Dsfx(2,Ntotc,*), Dstx(2,Ntotc,*)
-      DATA Zero /0.0d0/
+      integer::Lrmat, Igr
+      real(kind=8),parameter:: Zero=0.0d0
+      real(kind=8)::Dgoj, val, Su
+      integer::I,Ichan, Ifc, Ifzk, Ifzkj, Jchan, Jj, K, Nent, Next, Ntot, Ix
+      real(kind=8)::Z, Zz, Zzj
+      logical::elastic
 !
 !
 
-      call resParData%getSpinGroupInfo(spinInfo,igr)
       Nent = spinInfo%getNumEntryChannels()
       Next = spinInfo%getNumExitChannels()
       Ntot = spinInfo%getNumChannels()
-      DO I=1, spinInfo%getNumChannels()
-        if (radFitFlags%getTrueFitFlag(Igr, I).ne.0) then
-            iflApt = .true.
-        end if
-        if (radFitFlags%getEffFitFlag(Igr, I).ne.0) then
-            iflApe = .true.
-        end if
-      END DO
-      IF (Ncrssx.NE.0) THEN
-!
-         IF (iflApe.AND. Ifcros(1).NE.0) THEN
+      Dgoj = spinInfo%getGFactor()
+      Su = dAbs(calc%ener)
+
+      IF (any(calc%Ifcros)) THEN
+!
+         IF (calc%Ifcros(1)) THEN
 ! ***       derivatives of elastic cross section wrt effective radius
 ! ***       [d sigma-el/d phi] * [d phi/d effective radius]
             DO Ichan=1,Nent
-               Ifzk = radFitFlags%getEffFitFlag(Igr, Ichan)
+               Ifzk = calc%radiusData%getEffFitFlag(Igr, Ichan)
                IF (Ifzk.GT.0) THEN
-                  IF (Su.GT.Echan(Ichan)) THEN
-                     Zz = Dgoj * dSQRT(Su-Echan(Ichan))*Zke(Ichan)
+                  IF (Su.GT.calc%Echan(Ichan,Igr)) THEN
+                     Zz = Dgoj * dSQRT(Su-calc%Echan(Ichan,Igr))*calc%Zke(Ichan,Igr)
 ! ***                Note that Dgoj * {partial rho wrt a, for channel
 ! ***                            Ichan} = Dgoj * sqrt(E)*Zke = Zz*Zke
-                     Deriv(1,Ifzk) = Deriv(1,Ifzk) + Dsf(Ichan)*Zz
+                     val = calc%Dsf(Ichan)*Zz + calc%crossInternal(1, Igr, Ifzk)
+                     calc%crossInternal(1, Igr, Ifzk) = val
                   END IF
                END IF
             END DO
          END IF
 !
-         IF (Lrmat.EQ.0 .AND.iflApt) THEN
+         IF (Lrmat.EQ.0) THEN
 !
-            IF (Ifcros(1).NE.0 .OR. Ifcros(2).NE.0) THEN
+            IF (calc%Ifcros(1).OR. calc%Ifcros(2)) THEN
 ! ***          derivatives of elastic & absorption wrt true radius
                DO k=1,2
-                  IF (Ifcros(k).NE.0) THEN
+                  IF (calc%Ifcros(k)) THEN
                      DO Ichan=1,Ntot
-                        Ifzk = radFitFlags%getTrueFitFlag(Igr,Ichan)
-                        IF (Ifzk.GT.0 .AND.Su.GT.Echan(Ichan)) THEN
-                           Zz = Dgoj * dSQRT(Su-Echan(Ichan))*Zke(Ichan)
-                           Deriv(k,Ifzk) = Deriv(k,Ifzk) +    &
-                              Dst(k,Ichan)*zz
+                        Ifzk = calc%radiusData%getTrueFitFlag(Igr,Ichan)
+                        IF (Ifzk.GT.0 .AND.Su.GT.calc%Echan(Ichan,Igr)) THEN
+                           Zz = Dgoj * dSQRT(Su-calc%Echan(Ichan,Igr))*calc%Zke(Ichan,Igr)
+                           val = calc%Dst(k,Ichan)*zz + calc%crossInternal(k, Igr, Ifzk)
+                           calc%crossInternal(k, Igr, Ifzk) = val
                         END IF
                      END DO
                   END IF
@@ -80,32 +76,30 @@
 ! ***             (true) radius
                Ifc = 0
                DO Jj=1,Next
-                  IF (Ifcros(Jj+2).NE.0) Ifc = 1
+                  IF (calc%Ifcros(Jj+2)) Ifc = 1
                END DO
                IF (Ifc.EQ.1) THEN
                   DO Ichan=1,Nent
-                     Ifzk = radFitFlags%getTrueFitFlag(Igr,Ichan)
-                     IF (Su.LE.Echan(Ichan)) THEN
+                     Ifzk = calc%radiusData%getTrueFitFlag(Igr,Ichan)
+                     IF (Su.LE.calc%Echan(Ichan,Igr)) THEN
                         Zz = Zero
                      ELSE
-                        Zz = Dgoj*Zke(Ichan)*dSQRT(Su-Echan(Ichan))
+                        Zz = Dgoj*calc%Zke(Ichan,Igr)*dSQRT(Su-calc%Echan(Ichan,Igr))
                      END IF
                      DO Jj=1,Next
-                        IF (Jj+Nent.LE.Ntot .AND. Ifcros(Jj+2).NE.0   &
-                           .AND. If_Excl(Jj+Nent).EQ.Kaptur) THEN
+                        IF (Jj+Nent.LE.Ntot .AND. calc%useChannel(JJ+2, 1)) THEN
                            Jchan = Jj + Nent
-                           IF (radFitFlags%getTrueFitFlag(Igr,Ichan)   &
-                               .GT.0   &
-                               .AND. Zz.NE.Zero)   &
-                              Deriv(Jj+2,Ifzk) = Deriv(Jj+2,Ifzk) +   &
-                                                 Dstt(Jj,Ichan)*Zz
-                           Ifzkj = radFitFlags%getTrueFitFlag(Igr,Jchan)
+                           IF (Ifzk .GT.0 .AND. Zz.NE.Zero)   then
+                              val = calc%Dstt(Jj,Ichan)*Zz + calc%crossInternal(Jj+2, Igr, Ifzk)
+                              calc%crossInternal(Jj+2, Igr, Ifzk) = val
+                           end if
+                           Ifzkj = calc%radiusData%getTrueFitFlag(Igr,Jchan)
                            IF (Ifzkj.GT.0) THEN
-                              IF (Su.GT.Echan(Jchan)) THEN
-                                 Zzj = Dgoj*Zke(Jchan)*   &
-                                       Dsqrt(Su-Echan(Jchan))
-                                 Deriv(Jj+2,Ifzkj) = Deriv(Jj+2,Ifzkj) +   &
-                                       Dstt(Jj,Jchan)*Zzj
+                              IF (Su.GT.calc%Echan(Jchan,Igr)) THEN
+                                 Zzj = Dgoj*calc%Zke(Jchan,Igr)*   &
+                                       Dsqrt(Su-calc%Echan(Jchan,Igr))
+                                 val = calc%Dstt(Jj,Jchan)*Zzj + calc%crossInternal(Jj+2, Igr, Ifzkj)
+                                 calc%crossInternal(Jj+2, Igr, Ifzkj) = val
                               END IF
                            END IF
                         END IF
@@ -115,56 +109,61 @@
             END IF
 !
          END IF
-      END IF
+      end if
 !
 !
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
+        elastic = calc%reactType.ne.11
+
+         DO I=1, spinInfo%getNumChannels()
+           if (calc%radiusData%getTrueFitFlag(Igr, I).ne.0) then
+               iflApt = .true.
+           end if
+           if (calc%radiusData%getEffFitFlag(Igr, I).ne.0) then
+               iflApe = .true.
+           end if
+         END DO
 !
          IF (iflApe) THEN
 ! ***       derivatives of pieces of differential elastic scatt wrt
 ! ***          effective radius; First, diagonal pieces
-            IF (Ifdif.EQ.1) THEN
+            IF (elastic) THEN
                DO Ichan=1,Nent
-                  Ifzk = radFitFlags%getEffFitFlag(Igr, Ichan)
+                  Ifzk = calc%radiusData%getEffFitFlag(Igr, Ichan)
                   IF (Ifzk.GT.0) THEN
-                     Zz = Zke(Ichan)*Squ
-                     Derivx(1,Ichan,Ichan,Ifzk) =   &
-                        Derivx(1,Ichan,Ichan,Ifzk) +   &
-                        Zz*Dsfx(1,Ichan,Ichan)
-                     Derivx(2,Ichan,Ichan,Ifzk) =   &
-                        Derivx(2,Ichan,Ichan,Ifzk) +   &
-                        Zz*Dsfx(2,Ichan,Ichan)
+                     Zz = calc%Zke(Ichan,Igr)*calc%enerSq
+                     do ix = 1, 2
+                        val = calc%angInternal(Ix,Ichan,Ichan, Igr, Ifzk)
+                        val  = val + Zz*calc%Dsfx(Ix,Ichan,Ichan)
+                        calc%angInternal(Ix,Ichan,Ichan, Igr, Ifzk) = val
+                     end do
                   END IF
                END DO
             END IF
-            IF ( (Ifdif.EQ.1 .AND. Nent.GT.1) .OR. Ifdif.EQ.2) THEN
+            IF ( (elastic .AND. Nent.GT.1) .OR. .not.elastic) THEN
 ! ***          derivatives of pieces of differential cross section wrt
 ! ***             effective radius; Now, off-diagonal pieces
                DO Ichan=1,Ntot
                   DO Jchan=1,Nent
                      IF (Jchan.LT.Ichan) THEN
-                        IF ( (Ifdif.EQ.1 .AND. Ichan.LE.Nent) .OR.   &
-                             (Ifdif.EQ.2 .AND. Ichan.GT.Nent .AND.   &
-                              If_Excl(Ichan).EQ.Kaptur) ) THEN
-                           Ifzk = radFitFlags%getEffFitFlag(Igr, Ichan)
+                        IF ( calc%useChannel(Ichan, 2)) THEN
+                           Ifzk = calc%radiusData%getEffFitFlag(Igr, Ichan)
                            IF (Ifzk.GT.0) THEN
-                              Zz = Zke(Ichan)*Squ
-                              Derivx(1,Jchan,Ichan,Ifzk) =   &
-                                 Derivx(1,Jchan,Ichan,Ifzk) +   &
-                                 Zz*Dsfx(1,Jchan,Ichan)
-                              Derivx(2,Jchan,Ichan,Ifzk) =   &
-                                 Derivx(2,Jchan,Ichan,Ifzk) +    &
-                                 Zz*Dsfx(2,Jchan,Ichan)
+                              Zz = calc%Zke(Ichan,Igr)*calc%enerSq
+                              do ix = 1, 2
+                                 val = calc%angInternal(ix,Jchan,Ichan, Igr, Ifzk)
+                                 val = val + Zz*calc%Dsfx(Ix,Jchan,Ichan)
+                                 calc%angInternal(ix,Jchan,Ichan, Igr, Ifzk) = val
+                              end do
                            END IF
-                           Ifzk = radFitFlags%getEffFitFlag(Igr, Jchan)
+                           Ifzk = calc%radiusData%getEffFitFlag(Igr, Jchan)
                            IF (Ifzk.GT.0) THEN
-                              Zz = Zke(Jchan)*Squ
-                              Derivx(1,Jchan,Ichan,Ifzk) =   &
-                                 Derivx(1,Jchan,Ichan,Ifzk) +   &
-                                 Zz*Dsfx(1,Jchan,Ichan)
-                              Derivx(2,Jchan,Ichan,Ifzk) =   &
-                                 Derivx(2,Jchan,Ichan,Ifzk) +   &
-                                 Zz*Dsfx(2,Jchan,Ichan)
+                              Zz = calc%Zke(Jchan,Igr)*calc%enerSq
+                              do ix = 1, 2
+                                 val = calc%angInternal(ix,Jchan,Ichan, Igr, Ifzk)
+                                 val = val + Zz*calc%Dsfx(ix,Jchan,Ichan)
+                                 calc%angInternal(ix,Jchan,Ichan, Igr, Ifzk) = val
+                              end do
                            END IF
                         END IF
                      END IF
@@ -176,42 +175,37 @@
          IF (iflApt) THEN
 ! ***       derivatives of pieces of angular distribution wrt true radius
             DO Ichan=1,Ntot
-               Ifzk = radFitFlags%getTrueFitFlag(Igr,Ichan)
+               Ifzk = calc%radiusData%getTrueFitFlag(Igr,Ichan)
                Zz = Zero
                IF (Ifzk.GT.0) THEN
-                  Zz = Zke(Ichan)*Squ
-                  IF (Ifdif.EQ.1 .AND. Ichan.LE.Nent) THEN
-                     Derivx(1,Ichan,Ichan,Ifzk) =   &
-                        Derivx(1,Ichan,Ichan,Ifzk) +   &
-                        Zz*Dstx(1,Ichan,Ichan)
-                     Derivx(2,Ichan,Ichan,Ifzk) =   &
-                        Derivx(2,Ichan,Ichan,Ifzk) +   &
-                        Zz*Dstx(2,Ichan,Ichan)
+                  Zz = calc%Zke(Ichan,Igr)*calc%enerSq
+                  IF (elastic .AND. Ichan.LE.Nent) THEN
+                     do ix = 1, 2
+                        val = calc%angInternal(ix,Ichan,Ichan, Igr, Ifzk)
+                        val = val + Zz*calc%Dstx(Ix,Ichan,Ichan)
+                        calc%angInternal(ix,Ichan,Ichan, Igr, Ifzk) = val
+                     end do
                   END IF
                END IF
                DO Jchan=1,Nent
                   IF (Jchan.NE.Ichan) THEN
-                     IF ( (Ifdif.EQ.1 .AND. Ichan.LE.Nent) .OR.   &
-                          (Ifdif.EQ.2 .AND. Ichan.GT.Nent .AND.   &
-                           If_Excl(Ichan).EQ.Kaptur) ) THEN
-                        IF (radFitFlags%getTrueFitFlag(Igr,Ichan)   &
+                     IF ( calc%useChannel(Ichan, 2)) THEN
+                        IF (calc%radiusData%getTrueFitFlag(Igr,Ichan)   &
                             .GT.0) THEN
-                           Derivx(1,Jchan,Ichan,Ifzk) =   &
-                              Derivx(1,Jchan,Ichan,Ifzk) +   &
-                              Zz*Dstx(1,Jchan,Ichan)
-                           Derivx(2,Jchan,Ichan,Ifzk) =   &
-                              Derivx(2,Jchan,Ichan,Ifzk) +   &
-                              Zz*Dstx(2,Jchan,Ichan)
+                           do ix = 1, 2
+                             val = calc%angInternal(ix,Jchan,Ichan,Igr, Ifzk)
+                             val = val + Zz*calc%Dstx(ix,Jchan,Ichan)
+                             calc%angInternal(ix,Jchan,Ichan,Igr, Ifzk) = val
+                           end do
                         END IF
-                        Ifzkj=radFitFlags%getTrueFitFlag(Igr,Jchan)
+                        Ifzkj=calc%radiusData%getTrueFitFlag(Igr,Jchan)
                         IF (Ifzkj.GT.0) THEN
-                           Z = Zke(Jchan)*Squ
-                           Derivx(1,Jchan,Ichan,Ifzkj) =   &
-                              Derivx(1,Jchan,Ichan,Ifzkj) +   &
-                              Z*Dstx(1,Jchan,Ichan)
-                           Derivx(2,Jchan,Ichan,Ifzkj) =   &
-                              Derivx(2,Jchan,Ichan,Ifzkj) +   &
-                              Z*Dstx(2,Jchan,Ichan)
+                           Z = calc%Zke(Jchan,Igr)*calc%enerSq
+                           do ix = 1, 2
+                              val = calc%angInternal(ix,Jchan,Ichan, Igr, Ifzkj)
+                              val = val + Z*calc%Dstx(ix,Jchan,Ichan)
+                              calc%angInternal(ix,Jchan,Ichan, Igr, Ifzkj) = val
+                           end do
                         END IF
                      END IF
                   END IF
@@ -222,3 +216,4 @@
 !
       RETURN
       END
+end module
diff --git a/sammy/src/xct/mxct16.f90 b/sammy/src/xct/mxct16.f90
index 2a909c630..08e8e8fdf 100644
--- a/sammy/src/xct/mxct16.f90
+++ b/sammy/src/xct/mxct16.f90
@@ -1,124 +1,129 @@
+module mxct16_m
+use XctCrossCalc_M
+implicit none
+contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derwid (If_Excl, Ifcros, Pgar, Pgai, Deriv,   &
-         Derivx, Tr, Ti, Tx, Ddddd, Dgoj, Ntot, Nent, Nfprrr)
+      SUBROUTINE Derwid (spinInfo, calc, Igr)
 !
 ! *** generate Deriv = that portion of (partial Crss(k) wrt radius) that
 ! ***                       comes from the unvaried widths
 !
-      use fixedi_m
-      use ifwrit_m
-      use varyr_common_m
-      use EndfData_common_m, only : radFitFlags
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct09_m
 !
-      DIMENSION If_Excl(*), Ifcros(*), Pgar(Ntriag,Nfprrr,*),   &
-        Pgai(Ntriag,Nfprrr,*), Deriv(Ncrsss,*), Derivx(2,Ntotc,Ntotc,*),   &
-        Tr(Ncrsss,*), Ti(Ncrsss,*), Tx(2,Ntriag,*), Ddddd(*)
-      integer::iflagMatch
+      class(XctCrossCalc)::calc
+      type(SammySpinGroupInfo)::spinInfo
+      integer::Nent, Igr
+      real(kind=8)::Dgoj, val, A1, A2
+      logical::hasRad
 !
-      DATA Zero /0.0d0/
+      real(kind=8),parameter::Zero=0.0d0
+      integer::Ij, Iz, J, K, KL, M, Nchan, Nchanx, Numrrr, I, Ir, Ix
 !
 !
-      iflagMatch = radFitFlags%matchFitFlag()
-      Numrrr = radFitFlags%getNumRadInfo()
-      IF (Numrrr.EQ.0) Numrrr = Nfprrr
-      IF (Ncrssx.GT.0) THEN
+
+      hasRad = .false.
+      if( allocated(calc%iradIndex)) then
+          hasRad = any(calc%iradIndex.ne.0)
+       end if
+       if (.not.hasRad) return  ! no radius adjustments
+
+       Numrrr = size(calc%iradIndex)
+       Dgoj = spinInfo%getGFactor()
+       Nent = spinInfo%getNumEntryChannels()
+
+
+      IF (any(calc%Ifcros)) THEN
          DO Ir=1,Numrrr
-            IF (radFitFlags%getNumRadInfo().GT.0) THEN
-               Ix = radFitFlags%getTrueFitFlagByIndex(Ir)
-            ELSE
-               Ix = iflagMatch
-            END IF
-            IF (Ix.GT.0) THEN
-               Ix = Ix - Nfpres - Nfpext
-               DO K=1,Ncrsss
-                  Ddddd(K) = Zero
-               END DO
+            M = calc%iradIndex(Ir)
+            if (M.eq.0) exit  ! calc%iradIndex=0, means we found all unique true radii
+
+               calc%Ddddd = Zero
+
                Iz = 0
                Ij = 0
-               DO I=1,Ntot
+               DO I=1,calc%ntotc
                   DO J=1,I
                      Ij = Ij + 1
-                     IF (Pgai(Ij,Ix,Nnnn).NE.Zero) THEN
-                        DO K=1,Ncrsss
-                           IF (Ifcros(K).NE.0) Ddddd(K) = Ddddd(K) -   &
-                                        Pgai(Ij,Ix,Nnnn)*Ti(K,Ij)
+                     IF (calc%Pgai(Ij,Ir,Igr).NE.Zero) THEN
+                        DO K=1,calc%ntotc+1
+                           IF (calc%Ifcros(K)) then
+                               calc%Ddddd(K) = calc%Ddddd(K) - calc%Pgai(Ij,Ir,Igr)*calc%Ti(K,Ij)
+                           end if
                            Iz = Iz + 1
                         END DO
                      END IF
-                     IF (Pgar(Ij,Ix,Nnnn).NE.Zero) THEN
-                        DO K=1,Ncrsss
-                           IF (Ifcros(K).NE.0) Ddddd(K) = Ddddd(K) +    &
-                                         Pgar(Ij,Ix,Nnnn)*Tr(K,Ij)
+                     IF (calc%Pgar(Ij,Ir,Igr).NE.Zero) THEN
+                        DO K=1,calc%ntotc+1
+                           IF (calc%Ifcros(K)) then
+                              calc%Ddddd(K) = calc%Ddddd(K) +  calc%Pgar(Ij,Ir,Igr)*calc%Tr(K,Ij)
+                           end if
                            Iz = Iz + 1
                         END DO
                      END IF
                   END DO
                END DO
-               IF (Iz.NE.0) THEN
-                  IF (radFitFlags%getNumRadInfo().GT.0) THEN
-                     M = radFitFlags%getTrueFitFlagByIndex(Ir)
-                  ELSE
-                     M = iflagMatch
-                  END IF
+               IF (Iz.NE.0) THEN                 
                   DO K=1,2
-                     IF (Ifcros(K).NE.0) Deriv(K,M) = Dgoj*Ddddd(K)   &
-                        + Deriv(K,M)
+                     IF (calc%Ifcros(K)) then
+                        val = Dgoj*calc%Ddddd(K) + calc%crossInternal(K, Igr, M)
+                        calc%crossInternal(K, Igr, M) = val
+                     end if
+                  END DO
+                  DO K=3,calc%ntotc+1
+                     IF (calc%useChannel(K,1)) THEN
+                         val = Dgoj*calc%Ddddd(K) + calc%crossInternal(K, Igr, M)
+                         calc%crossInternal(K, Igr, M) = val
+                     END IF
                   END DO
-                  IF (Ncrsss.GT.2) THEN
-                     DO K=3,Ncrsss
-                        IF (Ifcros(K).NE.0 .AND.   &
-                           If_Excl(K-2+Nent).EQ.Kaptur) THEN
-                           Deriv(K,M) = Dgoj*Ddddd(K) + Deriv(K,M)
-                        END IF
-                     END DO
-                  END IF
                END IF
-            END IF
+
          END DO
       END IF
 !
 !
 ! *** now for differential elastic cross sections
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
          DO Ir=1,Numrrr
-            Ix = radFitFlags%getTrueFitFlagByIndex(Ir)
-            IF (Ix.GT.0) THEN
-               Ix = Ix - Nfpres - Nfpext
-               M = radFitFlags%getTrueFitFlagByIndex(Ir)
+            M = calc%iradIndex(Ir)
+            if (M.eq.0) exit ! calc%iradIndex=0, means we found all unique true radii
+
                Ij = 0
-               DO Ij=1,NN
-                  IF (Pgai(Ij,Ix,Nnnn).NE.Zero .OR.   &
-                      Pgar(Ij,Ix,Nnnn).NE.Zero      ) THEN 
-                     DO Nchan=1,Ntot
-                        Ifs = If_Stay (Nchan, Ifdif, Nent,   &
-                                       If_Excl(Nchan), Kaptur)
-                        IF (Ifs.EQ.0) THEN
+               DO Ij=1,calc%ntriag
+                  IF (calc%Pgai(Ij,Ir,Igr).NE.Zero .OR.   &
+                      calc%Pgar(Ij,Ir,Igr).NE.Zero      ) THEN
+                     DO Nchan=1,calc%ntotc                        
+                        IF (calc%useChannel(Nchan,2)) THEN
                            DO Nchanx=1,Nent
                               IF (Nchanx.LE.Nchan) THEN
                                  KL = (Nchan*(Nchan-1))/2 + Nchanx
                               ELSE
                                  KL = (Nchanx*(Nchanx-1))/2 + Nchan
                               END IF
-                              Derivx(1,Nchanx,Nchan,M) =   &
-                                    Derivx(1,Nchanx,Nchan,M) +   &
-                                    Pgar(Ij,Ix,Nnnn)*Tx(1,Ij,KL) -   &
-                                    Pgai(Ij,Ix,Nnnn)*Tx(2,Ij,KL)
-                              Derivx(2,Nchanx,Nchan,M) =   &
-                                    Derivx(2,Nchanx,Nchan,M) +   &
-                                    Pgar(Ij,Ix,Nnnn)*Tx(2,Ij,KL) +   &
-                                    Pgai(Ij,Ix,Nnnn)*Tx(1,Ij,KL)
+                              do ix = 1, 2
+                                 val = calc%angInternal(Ix,Nchanx,Nchan, Igr, M)
+                                 select case(i)
+                                     case(1)
+                                        A1 = calc%Pgar(Ij,Ir,Igr)*calc%Tx(1,Ij,KL)
+                                        A2 = -calc%Pgai(Ij,Ir,Igr)*calc%Tx(2,Ij,KL)
+                                     case(2)
+                                        A1 = calc%Pgar(Ij,Ir,Igr)*calc%Tx(2,Ij,KL)
+                                        A2 = calc%Pgai(Ij,Ir,Igr)*calc%Tx(1,Ij,KL)
+                                 end select
+                                 val = val + A1 + A2
+                                 calc%angInternal(Ix,Nchanx,Nchan, Igr, M) = val
+                              end do
                            END DO
                         END IF
                      END DO
                   END IF
                END DO
-            END IF
+
          END DO
       END IF
 !
       RETURN
       END
+end module mxct16_m
diff --git a/sammy/src/xct/mxct17.f90 b/sammy/src/xct/mxct17.f90
index e4348a2e1..ebb271d4d 100644
--- a/sammy/src/xct/mxct17.f90
+++ b/sammy/src/xct/mxct17.f90
@@ -1,68 +1,71 @@
+module mxct17_m
+use XctCrossCalc_M
+IMPLICIT None
+contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Dertze_Phi (Nent, Ifcros, Zke, Ddddtl, Derivx,   &
-         Dsf, Dsfx, Dstx, igr)
+      SUBROUTINE Dertze_Phi (spinInfo, calc, Igr)
 !
 ! *** Purpose -- Generate derivatives of cross section wrt sqrt(E) via Rho
 ! *** Note that [partial Rho wrt sqrt(E)] = effective radius (Zke is k without sqrt(E) term)
 !
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use varyr_common_m
-      use EndfData_common_m
+      use varyr_common_m, only : Elz, Etz
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
 !
+      class(XctCrossCalc)::calc
       type(SammySpinGroupInfo)::spinInfo
       type(SammyChannelInfo)::channelInfo
       type(RMatChannelParams)::channelI, channelJ
-      DIMENSION Ifcros(*), Zke(*), Ddddtl(*), Derivx(2,Ntotc,Ntotc,*),   &
-         Dsf(*), Dsfx(2,Ntotc,*), Dstx(2,Ntotc,*)
+      integer::igr
+      integer::Itz, Ilz, Jchan, nent, Ichan, Ix
+      real(kind=8)::Zz, A, R1, R2, val
 !
 !
-      IF (Itzero.LE.0 .AND. ILzero.LE.0) RETURN
-      Itz = Itzero
-      ILz = ILzero
-      call resParData%getSpinGroupInfo(spinInfo, igr)
-      IF (Ncrssx.NE.0) THEN
+      IF (calc%Itzero.LE.0 .AND. calc%ILzero.LE.0) RETURN
+      Itz = calc%Itzero
+      ILz = calc%ILzero
+      nent = spinInfo%getNumEntryChannels()
+
+      IF ((calc%ntotc+1).NE.0) THEN
 !
-         IF (Ifcros(1).NE.0) THEN
+         IF (calc%Ifcros(1)) THEN
 ! ***       Derivative of elastic cross section wrt sqrt(E) via phi
             DO Ichan=1,Nent
                call spinInfo%getChannelInfo(channelInfo, Ichan)
-               call resParData%getChannel(channelI, channelInfo)
-               A = Dsf(Ichan)*channelI%getApe()*Zke(Ichan)
-               Ddddtl(1) = Ddddtl(1) + A
+               call calc%resData%getChannel(channelI, channelInfo)
+               A = calc%Dsf(Ichan)*channelI%getApe()*calc%Zke(Ichan, Igr)
+               calc%Ddddtl(1) = calc%Ddddtl(1) + A
             END DO
          END IF
       END IF
 !
 !
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
 !
 ! ***    derivatives of pieces of angular distribution wrt Tzero &
 ! ***       Elzero diagonal pieces, via phi
          DO Ichan=1,Nent
             call spinInfo%getChannelInfo(channelInfo, Ichan)
-            call resParData%getChannel(channelI, channelInfo)
-            IF (Itz.GT.0) THEN
-               Zz = Etz*channelI%getApe()*Zke(Ichan)
-               Derivx(1,Ichan,Ichan,Itz) = Derivx(1,Ichan,Ichan,Itz) +   &
-                             Zz*Dsfx(1,Ichan,Ichan)
-               Derivx(2,Ichan,Ichan,Itz) = Derivx(2,Ichan,Ichan,Itz) +   &
-                             Zz*Dsfx(2,Ichan,Ichan)
+            call calc%resData%getChannel(channelI, channelInfo)
+            IF (Itz.GT.0) THEN               
+               Zz = Etz*channelI%getApe()*calc%Zke(Ichan, Igr)
+               do ix = 1, 2
+                   val = calc%angInternal(Ix,Ichan,Ichan, Igr, Itz)
+                   val = val + Zz*calc%Dsfx(Ix,Ichan,Ichan)
+                   calc%angInternal(Ix,Ichan,Ichan, Igr, Itz) = val
+               end do
             END IF
             IF (ILz.GT.0) THEN
-               Zz = ELz*channelI%getApe()*Zke(Ichan)
-               Derivx(1,Ichan,Ichan,ILz) = Derivx(1,Ichan,Ichan,ILz) +   &
-                             Zz*Dsfx(1,Ichan,Ichan)
-               Derivx(2,Ichan,Ichan,ILz) = Derivx(2,Ichan,Ichan,ILz) +   &
-                             Zz*Dsfx(2,Ichan,Ichan)
+               Zz = ELz*channelI%getApe()*calc%Zke(Ichan, Igr)
+               do ix = 1, 2
+                  val = calc%angInternal(Ix,Ichan,Ichan, Igr, ILz)
+                  val = val + Zz*calc%Dsfx(Ix,Ichan,Ichan)
+                  calc%angInternal(Ix,Ichan,Ichan, Igr, ILz) = val
+               end do
             END IF
          END DO
 !
@@ -72,43 +75,27 @@
 !x            DO Ichan=1,Ntot???????????
             DO Ichan=1,Nent
                call spinInfo%getChannelInfo(channelInfo, Ichan)
-               call resParData%getChannel(channelI, channelInfo)
+               call calc%resData%getChannel(channelI, channelInfo)
                DO Jchan=1,Nent
                   call spinInfo%getChannelInfo(channelInfo, Jchan)
-                  call resParData%getChannel(channelJ, channelInfo)
+                  call calc%resData%getChannel(channelJ, channelInfo)
                   IF (Jchan.NE.Ichan) THEN
-                     IF (Itz.GT.0) THEN
-                        Zz = Etz*channelI%getApe()*Zke(Ichan)
-                        Derivx(1,Jchan,Ichan,Itz) =   &
-                           Derivx(1,Jchan,Ichan,Itz) +   &
-                           Zz*Dstx(1,Jchan,Ichan)
-                        Derivx(2,Jchan,Ichan,Itz) =   &
-                           Derivx(2,Jchan,Ichan,Itz) +   &
-                           Zz*Dstx(2,Jchan,Ichan)
-                        Zz = Etz*channelJ%getApe()*Zke(Jchan)
-                        Derivx(1,Jchan,Ichan,Itz) =   &
-                           Derivx(1,Jchan,Ichan,Itz) +   &
-                           Zz*Dstx(1,Jchan,Ichan)
-                        Derivx(2,Jchan,Ichan,Itz) =   &
-                           Derivx(2,Jchan,Ichan,Itz) +   &
-                           Zz*Dstx(2,Jchan,Ichan)
-                     END IF
-                     IF (ILz.GT.0) THEN
-                        Zz = ELz*channelI%getApe()*Zke(Ichan)
-                        Derivx(1,Jchan,Ichan,ILz) =   &
-                           Derivx(1,Jchan,Ichan,ILz) +   &
-                           Zz*Dstx(1,Jchan,Ichan)
-                        Derivx(2,Jchan,Ichan,ILz) =   &
-                           Derivx(2,Jchan,Ichan,ILz) +   &
-                           Zz*Dstx(2,Jchan,Ichan)
-                        Zz = ELz*channelJ%getApe()*Zke(Jchan)
-                        Derivx(1,Jchan,Ichan,ILz) =   &
-                           Derivx(1,Jchan,Ichan,ILz) +   &
-                           Zz*Dstx(1,Jchan,Ichan)
-                        Derivx(2,Jchan,Ichan,ILz) =   &
-                           Derivx(2,Jchan,Ichan,ILz) +   &
-                           Zz*Dstx(2,Jchan,Ichan)
-                     END IF
+                     R1 = channelI%getApe()*calc%Zke(Ichan, Igr)
+                     R2 = channelJ%getApe()*calc%Zke(Jchan, Igr)
+                     do ix = 1, 2
+                        IF (Itz.GT.0) THEN
+                           val = calc%angInternal(Ix,Jchan,Ichan,Igr, Itz)
+                           val = val +  Etz*R1 * calc%Dstx(Ix,Jchan,Ichan)
+                           val = val +  Etz*R2 * calc%Dstx(Ix,Jchan,Ichan)
+                           calc%angInternal(Ix,Jchan,Ichan, Igr, Itz) = val
+                        end if
+                        IF (ILz.GT.0) THEN
+                            val = calc%angInternal(Ix,Jchan,Ichan, Igr, ILz)
+                            val = val + Elz*R1*calc%Dstx(Ix,Jchan,Ichan)
+                            val = val + Elz*R2*calc%Dstx(Ix,Jchan,Ichan)
+                            calc%angInternal(Ix,Jchan,Ichan, Igr, ILz)  = val
+                        end if
+                     end do
                   END IF
                END DO
             END DO
@@ -122,46 +109,46 @@
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Dertze (Nent, Next, If_Excl, Ifcros, Zke,   &
-         Ddddtl, Derivx, Dst, Dstt, Dstx, Nnext, Ntotnn, igr)
+      SUBROUTINE Dertze (spinInfo, calc, Igr)
 !
 ! *** Purpose -- Generate derivatives of cross section wrt sqrt(E) via Rho
 ! *** Note that [partial Rho wrt sqrt(E)] = true radius (Zke is k without sqrt(E) term)
 !
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use varyr_common_m
-      use EndfData_common_m
+      use varyr_common_m, only : Elz, Etz
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use SammySpinGroupInfo_M
 !
 !
+      class(XctCrossCalc)::calc
       type(SammySpinGroupInfo)::spinInfo
-      type(SammyChannelInfo)::channelInfo
+      type(SammyChannelInfo)::channelInfo      
       type(RMatChannelParams)::channelI, channelJ
-      DIMENSION If_Excl(*), Ifcros(*), Zke(*), Ddddtl(*),   &
-         Derivx(2,Ntotc,Ntotc,*), Dst(2,*), Dstt(Nnext,*),   &
-         Dstx(2,Ntotc,*)
-!
-!
-      IF (Itzero.LE.0 .AND. ILzero.LE.0) RETURN
-      Itz = Itzero
-      ILz = ILzero
-      call resParData%getSpinGroupInfo(spinInfo, igr)
-      IF (Ncrssx.NE.0) THEN
-!
-         IF (Ifcros(1).NE.0 .OR. Ifcros(2).NE.0) THEN
+      integer::igr
+      integer::Itz, ILz, nent, next, Ntotnn
+      integer::Ichan, Jchan, Jj, Ifc, ix
+      real(kind=8)::Xx, Zz, R1, R2, val
+!
+!
+      IF (calc%Itzero.LE.0 .AND. calc%ILzero.LE.0) RETURN
+      Itz = calc%Itzero
+      ILz = calc%ILzero
+      nent = spinInfo%getNumEntryChannels()
+      Next = spinInfo%getNumExitChannels()
+      Ntotnn = spinInfo%getNumChannels()
+
+      IF (any(calc%Ifcros)) THEN
+!
+         IF (calc%Ifcros(1) .OR. calc%Ifcros(2)) THEN
 ! ***       derivatives of elastic and capture cross section wrt Tzero &
 ! ***          Elzero, via S (shift) & P (penetrability)
             DO Ichan=1,Nent
                call spinInfo%getChannelInfo(channelInfo, Ichan)
-               call resParData%getChannel(channelI, channelInfo)
-               Ddddtl(1) = Ddddtl(1) +   &
-                           channelI%getApt()*Zke(Ichan)*Dst(1,Ichan)
-               Ddddtl(2) = Ddddtl(2) +   &
-                           channelI%getApt()*Zke(Ichan)*Dst(2,Ichan)
+               call calc%resData%getChannel(channelI, channelInfo)
+               calc%Ddddtl(1) = calc%Ddddtl(1) +   &
+                           channelI%getApt()*calc%Zke(Ichan,Igr)*calc%Dst(1,Ichan)
+               calc%Ddddtl(2) = calc%Ddddtl(2) +   &
+                           channelI%getApt()*calc%Zke(Ichan,Igr)*calc%Dst(2,Ichan)
             END DO
          END IF
 !
@@ -170,17 +157,17 @@
 ! ***          wrt Tzero & Elzero via S & P
             Ifc = 0
             DO Jj=1,Next
-               IF (Ifcros(Jj+2).NE.0) Ifc = 1
+               IF (calc%Ifcros(Jj+2)) Ifc = 1
             END DO
             IF (Ifc.NE.0) THEN
                DO Ichan=1,Nent
                   call spinInfo%getChannelInfo(channelInfo, Ichan)
-                  call resParData%getChannel(channelI, channelInfo)
-                  Xx = channelI%getApt()*Zke(Ichan)
+                  call calc%resData%getChannel(channelI, channelInfo)
+                  Xx = channelI%getApt()*calc%Zke(Ichan, Igr)
                   DO Jj=1,Next
-                     IF (Jj+Nent.LE.Ntotnn .AND. Ifcros(Jj+2).NE.0) THEN
-                       IF (If_Excl(Jj+Nent).EQ.Kaptur) THEN
-                         Ddddtl(Jj+2) = Ddddtl(Jj+2) + Xx*Dstt(Jj,Ichan)
+                     IF ((Jj+Nent).LE.Ntotnn .AND. calc%Ifcros(Jj+2)) THEN
+                       IF (calc%useChannel(JJ+2,1)) THEN
+                         calc%Ddddtl(Jj+2) = calc%Ddddtl(Jj+2) + Xx*calc%Dstt(Jj,Ichan)
                        END IF
                      END IF
                   END DO
@@ -190,60 +177,51 @@
       END IF
 !
 !
-      IF (Ifdif.NE.0) THEN
+      IF (calc%needAngular) THEN
 !
 ! ***    derivatives of pieces of angular distribution wrt Tzero &
 ! ***      Elzero via S & P
 !x         DO Ichan=1,Nent???????
          DO Ichan=1,Ntotnn
             call spinInfo%getChannelInfo(channelInfo, Ichan)
-            call resParData%getChannel(channelI, channelInfo)
+            call calc%resData%getChannel(channelI, channelInfo)
             IF (Ichan.LE.Nent) THEN
-               IF (Itz.GT.0) THEN
-                  Zz = Etz*channelI%getApt()*Zke(Ichan)
-                  Derivx(1,Ichan,Ichan,Itz) = Derivx(1,Ichan,Ichan,Itz)+   &
-                                Zz*Dstx(1,Ichan,Ichan)
-                  Derivx(2,Ichan,Ichan,Itz) = Derivx(2,Ichan,Ichan,Itz)+   &
-                                Zz*Dstx(2,Ichan,Ichan)
-               END IF
-               IF (ILz.GT.0) THEN
-                  Zz = Elz*channelI%getApt()*Zke(Ichan)
-                  Derivx(1,Ichan,Ichan,ILz) = Derivx(1,Ichan,Ichan,ILz)+   &
-                                Zz*Dstx(1,Ichan,Ichan)
-                  Derivx(2,Ichan,Ichan,ILz) = Derivx(2,Ichan,Ichan,ILz)+   &
-                                Zz*Dstx(2,Ichan,Ichan)
-               END IF
+               Zz = channelI%getApt()*calc%Zke(Ichan, igr)
+               do ix = 1, 2
+                  if (Itz.gt.0) then
+                      val = calc%angInternal(Ix,Ichan,Ichan, Igr, Itz)
+                      val = val + Zz * Etz * calc%Dstx(Ix,Ichan,Ichan)
+                      calc%angInternal(Ix,Ichan,Ichan, Igr, Itz) = val
+                  end if
+                  if (Ilz.gt.0) then
+                      val = calc%angInternal(Ix,Ichan,Ichan, Igr, Ilz)
+                      val = val + Zz * Elz * calc%Dstx(Ix,Ichan,Ichan)
+                      calc%angInternal(Ix,Ichan,Ichan, Igr, Ilz) = val
+                  end if
+               end do
             END IF
 !X            DO Jchan=1,Ichan
             DO Jchan=1,Nent
               call spinInfo%getChannelInfo(channelInfo, Jchan)
-              call resParData%getChannel(channelJ, channelInfo)
+              call calc%resData%getChannel(channelJ, channelInfo)
               IF (Jchan.NE.Ichan) THEN
-                IF (Itz.GT.0) THEN
-                  Zz = Etz*channelI%getApt()*Zke(Ichan)
-                  Derivx(1,Jchan,Ichan,Itz) = Derivx(1,Jchan,Ichan,Itz)+   &
-                             Zz*Dstx(1,Jchan,Ichan)
-                  Derivx(2,Jchan,Ichan,Itz) = Derivx(2,Jchan,Ichan,Itz)+   &
-                             Zz*Dstx(2,Jchan,Ichan)
-                  Zz = Etz*channelJ%getApt()*Zke(Jchan)
-                  Derivx(1,Jchan,Ichan,Itz) = Derivx(1,Jchan,Ichan,Itz)+   &
-                             Zz*Dstx(1,Jchan,Ichan)
-                  Derivx(2,Jchan,Ichan,Itz) = Derivx(2,Jchan,Ichan,Itz)+   &
-                             Zz*Dstx(2,Jchan,Ichan)
-! ??? double-counting here?
-                END IF
-                IF (ILz.GT.0) THEN
-                  Zz = ELz*channelI%getApt()*Zke(Ichan)
-                  Derivx(1,Jchan,Ichan,ILz) = Derivx(1,Jchan,Ichan,ILz)+   &
-                             Zz*Dstx(1,Jchan,Ichan)
-                  Derivx(2,Jchan,Ichan,ILz) = Derivx(2,Jchan,Ichan,ILz)+   &
-                             Zz*Dstx(2,Jchan,Ichan)
-                  Zz = ELz*channelJ%getApt()*Zke(Jchan)
-                  Derivx(1,Jchan,Ichan,ILz) = Derivx(1,Jchan,Ichan,ILz)+   &
-                             Zz*Dstx(1,Jchan,Ichan)
-                  Derivx(2,Jchan,Ichan,ILz) = Derivx(2,Jchan,Ichan,ILz)+   &
-                             Zz*Dstx(2,Jchan,Ichan)
-                END IF
+                R1  = channelI%getApt()*calc%Zke(Ichan, igr)
+                R2  = channelJ%getApt()*calc%Zke(Jchan, igr)
+                do ix = 1, 2
+                  IF (Itz.GT.0) THEN
+                     val = calc%angInternal(Ix,Jchan,Ichan, Igr, Itz)
+                     val = val + Etz * R1 * calc%Dstx(ix,Jchan,Ichan)
+                     val = val + Etz * R2 * calc%Dstx(ix,Jchan,Ichan)
+                     calc%angInternal(Ix,Jchan,Ichan,Igr, Itz) = val
+                     ! ??? double-counting here?
+                  end if
+                  IF (Ilz.GT.0) THEN
+                     val = calc%angInternal(Ix,Jchan,Ichan,Igr, Ilz)
+                     val = val + Elz * R1 * calc%Dstx(ix,Jchan,Ichan)
+                     val = val + Elz * R2 * calc%Dstx(ix,Jchan,Ichan)
+                     calc%angInternal(Ix,Jchan,Ichan, Igr, Ilz) = val
+                  end if
+                end do
               END IF
             END DO
          END DO
@@ -255,32 +233,33 @@
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Derzzz (Crss, Deriv, Ddddtl, Dgoj)
+      SUBROUTINE Derzzz (spinInfo, calc, Igr)
 !
 ! *** Purpose -- calculate the piece of (Derivative of sigma wrt Tzero
 ! ***    & Elzero) * (E/4pi) that comes directly from the 1/E term (1/k**2)
 ! ***    in the formula for cross section
 !
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use varyr_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-!
-      DIMENSION Crss(*), Deriv(Ncrsss,*), Ddddtl(*)
-      !  Napres -> all parameters for which derivatives are needed
-      !            not restricted to resonance parameters
-      !            only distantly related to the parameter of the same
-      !            name that was in fixedi_
-!     DIMENSION Crss(Ncrsss), Deriv(Ncrsss,Napres)
-      DATA Two/2.0d0/
-!
-      Itz = Itzero
-      ILz = Ilzero
-      DO I=1,Ncrsss
-         A = Ddddtl(I)*Dgoj - Crss(I)*Two/Squ
-         IF (Itz.GT.0) Deriv(I,Itz) = A*Etz
-         IF (Ilz.GT.0) Deriv(I,Ilz) = A*Elz
+      use varyr_common_m, only : Elz, Etz
+      use SammySpinGroupInfo_M
+!
+      class(XctCrossCalc)::calc
+      type(SammySpinGroupInfo)::spinInfo
+      integer::Igr, I
+      real(kind=8)::val, A, Dgoj
+      real(kind=8),parameter:: Two= 2.0d0
+!
+      Dgoj = spinInfo%getGFactor()
+      DO I=1,calc%Ntotc + 1
+         val = calc%crossInternal(I, Igr, 0)
+         A = calc%Ddddtl(I)*Dgoj - val*Two/calc%enerSq
+         IF (calc%Itzero.GT.0)  then
+            val = A*Etz + calc%crossInternal(I,Igr, calc%Itzero)
+            calc%crossInternal(I,Igr, calc%Itzero ) = val
+         end if
+         IF (calc%Ilzero.GT.0) then
+            val = A*Elz + calc%crossInternal(I,Igr, calc%Ilzero)
+            calc%crossInternal(I,Igr, calc%Ilzero) = val
+         end if
       END DO
 !
       RETURN
@@ -289,25 +268,29 @@
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Deriso (Ifzke, Crss, Deriv, AbnVal)
+      SUBROUTINE Deriso (spinInfo, calc, Igr)
 !
 ! *** Purpose -- find derivative of Crss wrt isotopic abundance
 !
-      use fixedi_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-!
-      DIMENSION Crss(*), Deriv(Ncrsss,*)
-      !  Napres -> all parameters for which derivatives are needed
-      !            not restricted to resonance parameters
-      !            only distantly related to the parameter of the same
-      !            name that was in fixedi_
-!     DIMENSION Crss(Ncrsss), Deriv(Ncrsss,Napres), Ifzke
+      use SammySpinGroupInfo_M
+      IMPLICIT None
 !
-      IF (Ifzke.LE.0) RETURN
-      Ifzk = Ifzke
-      DO I=1,Ncrsss
-         Deriv(I,Ifzk) = Crss(I)/AbnVal
+      class(XctCrossCalc)::calc
+      type(SammySpinGroupInfo)::spinInfo
+      integer::Igr, iflIso, I
+      real(kind=8)::val, AbnVal
+
+!
+      iflIso = spinInfo%getAbundanceFitFlag()
+      if (iflIso.le.0) RETURN
+
+      AbnVal = spinInfo%getAbundance()
+      DO I=1, calc%Ntotc + 1
+         val = calc%crossInternal(I, Igr, 0)
+         val = val/AbnVal + calc%crossInternal(I, Igr, iflIso)
+         calc%crossInternal(I,Igr, iflIso) = val
       END DO
 !
       RETURN
-      END
+      END SUBROUTINE
+end module mxct17_m
diff --git a/sammy/src/xct/mxct18.f90 b/sammy/src/xct/mxct18.f90
index b8f933a19..af30e1cd1 100644
--- a/sammy/src/xct/mxct18.f90
+++ b/sammy/src/xct/mxct18.f90
@@ -1,68 +1,41 @@
 module mxct18_m
 use XctCrossCalc_M
+!Todo: Remove global parameters
 contains
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Zwhich (calc, Sigxxx, Dasigx, Dbsigx, Sigsin, Dasigs,   &
-         Dbsigs, Theory, Su, Eb, Lllmmm, Kslow)
+      SUBROUTINE Zwhich (calc)
 !
 ! *** Purpose -- Set the particular cross sections needed for this run
 !
-      use oops_common_m
-      use fixedi_m
-      use ifwrit_m
-      use exploc_common_m
-      use templc_common_m
+      use ifwrit_m, only : Kssmsc, Kaverg
+      use exploc_common_m, only : A_Isiabn ,                    &
+                 A_Iprdet , I_Ifldet , I_Iigrde , I_Iflmsc ,    &
+                 A_Icmlab , I_Isoqva
       use mxct20_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct19_m
+      IMPLICIT None
       class(XctCrossCalc)::calc
-      real(kind=8),pointer,dimension(:)::A_Ietax
 !
-      DIMENSION Sigxxx(Nnnsig,*), Dasigx(Nnnsig,*),   &
-         Dbsigx(Nnnsig,Ndbxxx,*), Sigsin(*), Dasigs(*), Dbsigs(Ndbxxx,*)
-      DATA Zero /0.0d0/
+      real(kind=8),parameter::Zero = 0.0d0
 !
-      M = Nnniso
-      IF (Iq_Val.GT.M) M = Iq_Val
-      CALL Zero_Array (Sigxxx, Nnnsig*M)
-      IF (Ndasig.GT.0) CALL Zero_Array (Dasigx, Nnnsig*Ndasig)
-      IF (Ndbsig.GT.0) CALL Zero_Array (Dbsigx, Nnnsig*Ndbsig*M)
-      IF (Ksindi.GT.0) THEN
-         CALL Zero_Array (Sigsin, M)
-         IF (Ndasig.GT.0) CALL Zero_Array (Dasigs, Ndasig)
-         IF (Ndbsig.GT.0) CALL Zero_Array (Dbsigs, Ndbsig*M)
-      END IF
-!
-      IF (Su.EQ.Zero) RETURN
+      IF (calc%ener.EQ.Zero) RETURN
 !
-      IF ((Kcros.EQ. 9 .OR. (Kcros.LT.7 .AND. (Kssmsc.EQ.0 .OR.   &
+      IF ((calc%reactType.EQ. 9 .OR. (calc%reactType.LT.7 .AND. (Kssmsc.EQ.0 .OR.   &
          Kssmsc.EQ.-1))) .AND. Kaverg.NE.2) THEN
 !
-! ***    Here for no scattering of any kind, only one type of cross section
-         isize = size(A_Iprmsc)
-         A_Ietax => A_Iprmsc(Kjetan:isize)
-         if (size(A_Ietax).lt.mjetan) then
-             STOP '[STOP in Zwhich in mxct18.f  A_Iprmsc is too small ]'
-         end if
-         CALL Prtclr ( I_Ixciso ,   &
-            I_Iflmsc , A_Ietax ,   &
-            A_Ietaee , Theory, Sigxxx, Dasigx, Dbsigx,   &
-            A_Icrss , A_Ideriv ,  A_Itermf, I_Iisopa , Su, Eb)
+! ***    Here for no scattering of any kind, only one type of cross section   
+         CALL Prtclr (calc)
 !
       ELSE
 ! ***    Here where there is scattering, self-shielding, angular
 ! ***       distributions, or something  involving more than one
 ! ***       type of cross section
          CALL Diffel ( calc, A_Isiabn ,    &
-            I_Ifexcl ,   &
             A_Iprdet , I_Ifldet , I_Iigrde , I_Iflmsc ,       &
-            Sigxxx, Dasigx, Dbsigx, Sigsin, Dasigs, Dbsigs,   &
-            I_Iisopa , A_Icccll, A_Idddll,                    &
-            A_Icrss , A_Ideriv , A_Icrssx , A_Idervx , A_Itermf,   &
-            A_Iterfx, A_Iechan , A_Icmlab , I_Isoqva , Lllmmm,   &
-            Su, Eb, Kslow)
+            A_Icmlab , I_Isoqva)
 !
       END IF
       RETURN
diff --git a/sammy/src/xct/mxct19.f90 b/sammy/src/xct/mxct19.f90
index bc43961c5..b8d3fd70a 100644
--- a/sammy/src/xct/mxct19.f90
+++ b/sammy/src/xct/mxct19.f90
@@ -1,244 +1,209 @@
+module mxct19_m
+use XctCrossCalc_M
+IMPLICIT None
+contains
 !
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Prtclr (Ixciso, Iflmsc,   &
-         Etanux, Etaeee, Theory, Sigxxx, Dasigx, Dbsigx,   &
-         Crss, Deriv, Termf, Isopar, Su, Eb)
+      SUBROUTINE Prtclr (calc)
 !
 ! *** Purpose -- Set Sigxxx(...) = the particular cross sections needed
 ! ***               for this run.
-! ***            Also, set the derivatives to Dasigx(Nnnsig,iIipar)
-! ***               and Dbsigx(Nnnsig,iIipar,Nnniso).
+! ***            Also, set the derivatives
 !
 ! *** Note -- changes made here may also need to be made in sub-routine
 ! ***         INDIVI in mrec3.f
 !
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use constn_common_m
-      use EndfData_common_m
+      use constn_common_m, only : Fourpi
       use SammySpinGroupInfo_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-!
-      DIMENSION Ixciso(*), Iflmsc(*),   &
-         Etanux(*), Etaeee(*),   &
-         Sigxxx(Nnnsig,*), Dasigx(Nnnsig,*), Dbsigx(Nnnsig,Ndbxxx,*),   &
-         Isopar(*), Crss(Ncrsss,*), Deriv(Ncrsss,Nnpar,*),   &
-         Termf(*)
-!      DIMENSION
-!     *   Ixciso(Numiso), Iflmsc(Nummsc), Etanux(Mjetan),
-!     *   Etaeee(Mjetan), Sigxxx(Nnnsig,Nnniso),
-!     *   Dasigx(Nnnsig,Ndasig), Dbsigx(Nnnsig,Ndbsig,Nnniso),
-!     *   Isopar(Nfpall), Crss(Ncrsss,Ngroup), Deriv(Ncrsss,Nnpar,Ngroup)
-!
-      DIMENSION A2aaaa(2,2), D2aaaa(2,2)
+!
+      type(XctCrossCalc)::calc
+      real(kind=8)::Su
+      integer::I, Iipar,  Iso, K1, K2, N, Nd, Nnn
+      integer::isoN
+      real(kind=8)::Etan, A1, A2, A3, Answer, C, D,  Eta
+      real(kind=8)::F, A2d, A2x, Ab, Dtermf,  Termff, Terma, val
+
+      real(kind=8)::A2aaaa(2,2), D2aaaa(2,2)
       type(SammySpinGroupInfo)::spinInfo
-      DATA A2aa31/2.92d0/, A2aa32/0.0d0/, A2aa41/2.48d0/, A2aa42/1.17d0/
+      real(kind=8),parameter:: A2aa31 = 2.92d0, A2aa32= 0.0d0, A2aa41=2.48d0, A2aa42=1.17d0
 ! *** change per request from Mike Moore, Nov 12, 1996
 !
-      DATA Zero /0.0d0/
+      real(kind=8),parameter:: Zero=0.0d0
+      logical::haveAny
 !
 !
-      IF (Kcros.EQ.7 .OR. Kcros.EQ.11 .OR. Kcros.EQ.8 .OR. Kcros.LT.0)   &
+      IF (calc%reactType.EQ.7  .OR.  &
+          calc%reactType.EQ.11 .OR.  &
+          calc%reactType.EQ.8  .OR.  &
+          calc%reactType.LT.0)   then
          STOP '[STOP in Prtclr in xct/mxct19.f]'
+      end if
 !
       Answer = Zero
-      Terma  = Zero
-      Termff = Zero
       C      = Zero
       F      = Zero
       Eta    = Zero
+
+      Su = dAbs(calc%ener)
 !
-      IF (Kfake.EQ.1) Theory = Zero
-      DO 60 Iso=1,Nnniso
-         IF (Nnniso.EQ.Numiso .AND. Ixciso(Iso).EQ.1) GO TO 60
-         IF (Kcros.NE.6 .AND. Kcros.NE.9 .AND. Su.EQ.Zero) THEN
+      DO 60 Iso=1,calc%numIso
+         IF (calc%reactType.NE.6 .AND. &
+             calc%reactType.NE.9 .AND. &
+             calc%ener.EQ.Zero) THEN
             Answer = Zero
             GO TO 15
          END IF
 !
 ! ***    first, set the cross sections:
-         Termn = Zero
-         Terma = Zero
+         calc%Termf = Zero
          Termff = Zero
-         IF (Ncrsss.GT.2) THEN
-            DO I=3,Ncrsss
-               Termf(I-2) = Zero
-            END DO
-         END IF
 !
-         DO 10 N=1,resParData%getNumSpinGroups()
-            IF (Kcros.EQ.9) THEN
-               A2aaaa(N,1) = Crss(3,N)
-               A2aaaa(N,2) = Crss(4,N)
+         DO 10 N=1,calc%resData%getNumSpinGroups()
+            IF (calc%reactType.EQ.9) THEN
+               A2aaaa(N,1) = calc%crossInternal(3, N, 0)
+               A2aaaa(N,2) = calc%crossInternal(4, N, 0)
             ELSE
-               call resParData%getSpinGroupInfo(spinInfo, N)
-               isoN = spinInfo%getIsotopeIndex()      
-               IF (IsoN.EQ.Iso .OR. Nnniso.NE.Numiso) THEN
+               call calc%resData%getSpinGroupInfo(spinInfo, N)
+               isoN = 1
+               if (calc%separateIso) isoN = spinInfo%getIsotopeIndex()
+               IF (isoN.eq.iso) THEN
 ! ***          If we're keeping the Isotopes separate, and this spin
 ! ***             group does not belong to this Isotope, then do not
 ! ***             include this spin group this time thru
                   Ab = spinInfo%getAbundance()
-                  Termn = Crss(1,N)*Ab + Termn
-                  Terma = Crss(2,N)*Ab + Terma
-                  IF (Ncrsss.GE.3) THEN
-                     DO I=1,Ncrsss-2
-                        Termf(I) = Termf(I) + Crss(I+2,N)*Ab
-                     END DO
-                  END IF
+                  do i = 1, calc%ntotc + 1
+                     calc%Termf(I) = calc%Termf(I) + calc%crossInternal(I, N, 0)*Ab
+                  end do
                END IF
             END IF
    10    CONTINUE
-         IF (Ncrsss.GE.3) THEN
-            DO I=1,Ncrsss-2
-               Termff = Termff + Termf(I)
-            END DO
-         END IF
+         DO I=3,  calc%ntotc + 1
+             Termff = Termff + calc%Termf(I)
+         END DO        
 !
 ! ***    total cross section
-         IF (Kcros.EQ.1) Answer = Termn + Terma
+         IF (calc%reactType.EQ.1) Answer = calc%Termf(1) + calc%Termf(2)
 !
 ! ***    elastic scattering cross section
-         IF (Kcros.EQ.2) Answer = Termn
+         IF (calc%reactType.EQ.2) Answer = calc%Termf(1)
 !
 ! ***    inelastic scattering cross section, or fission, or reaction
-         IF (Kcros.EQ.3 .AND. Kaptur.EQ.0) Answer = Termff
-         IF (Kcros.EQ.3 .AND. Kaptur.EQ.1) Answer = Terma - Termff
+!   or cross section at position 1, if we calculate eta
+         IF (calc%reactType.EQ.3.or.calc%reactType.EQ.6) then
+             if (.not.calc%addElimKapt) then
+                 Answer = Termff
+             else
+                 Answer = calc%Termf(2) - Termff
+             end if
+         end if
 !
 ! ***    capture cross section
-         IF (Kcros.EQ.4) Answer = Terma - Termff
+         IF (calc%reactType.EQ.4)  Answer = calc%Termf(2) - Termff
 !
 ! ***    absorption cross section
-         IF (Kcros.EQ.5) Answer = Terma
 !
-! ***    eta
-         IF (Kcros.EQ.6) THEN
-            IF (Mjetan.GT.1) THEN
-               Etan = A_Interp (Su, Etanux, Etaeee, Mjetan, A1, A2, K1,   &
-                  K2)
-            ELSE
-               Etan = Etanuu
-               A1 = 1.0d0
-               K1 = 1
-               K2 = 0
-            END IF
-            IF (Kefcap.EQ.0) THEN
-               A3 = Termff/Terma
-               Answer = A3*Etan
-            ELSE
-               C = (Terma-Termff)*Effcap
-               F = Termff*Efffis
-               A3 = F/(F+C)
-               Answer = A3*Etan
-               Eta = Answer
-            END IF
-         END IF
+         IF (calc%reactType.EQ.5) Answer = calc%Termf(2)
+
+         ! eta: position 1: fission, position 2: absorption
+         if (calc%reactType.EQ.6) then
+             call  calc%crossData%addDataNs(calc%row, 2, 0, Iso, calc%Termf(2))
+         end if
+!
 !
 ! ***    A2
-         IF (Kcros.EQ.9) THEN
+         IF (calc%reactType.EQ.9) THEN
             A2 = A2aa31*A2aaaa(1,1) + A2aa32*A2aaaa(1,2) +   &
                  A2aa41*A2aaaa(2,1) + A2aa42*A2aaaa(2,2)
             A2x = A2aaaa(1,1)+A2aaaa(1,2)+A2aaaa(2,1)+A2aaaa(2,2)
             Answer = A2/A2x
          END IF
 !
-         IF (Kcros.NE.6 .AND. Kcros.NE.9) Answer = Answer*Fourpi/Su
+         IF (calc%reactType.NE.6 .AND. calc%reactType.NE.9) Answer = Answer*Fourpi/Su
 !
-         IF (Eb.LT.Zero) Answer = - Answer
+         IF (calc%ener.LT.Zero.and.calc%reactType.Ne.6) Answer = - Answer
 !
    15    CONTINUE
-         Sigxxx(1,Iso) = Answer
-         IF (Kfake.EQ.1) Theory = Answer + Theory      
+         call  calc%crossData%addDataNs(calc%row, 1, 0, Iso, Answer)
+
+         Terma = calc%termf(2)  ! save absorption cross section
 !
 !
 ! ***    Now, set the derivatives (if needed)
-         IF ( (Ndasig.GT.0 .OR. Ndbsig.GT.0) .AND.   &
-             (Kcros.EQ.6 .OR. Kcros.EQ.9 .OR. Su.NE.Zero) ) THEN
-!
-            DO Iipar=1,Ndasig+Ndbsig
-               Iiparn = Iipar - Ndasig
-               Dtermn = Zero
-               Dterma = Zero
-               IF (Ncrsss.GE.3) THEN
-                  DO I=1,Ncrsss-2
-                     Termf(I) = Zero
-                  END DO
-               END IF
-               DO N=1,resParData%getNumSpinGroups()
-                  J_Deriv = 0
-                  DO I=1,Ncrsss
-                     IF (Deriv(I,Iipar,N).NE.Zero) J_Deriv = 1
-                  END DO
-                  IF (J_Deriv.EQ.1) THEN
-                     IF (Kcros.EQ.9) THEN
-                        D2aaaa(N,1) = Deriv(3,Iipar,N)
-                        D2aaaa(N,2) = Deriv(4,Iipar,N)
+
+         IF (  calc%covariance%getNumTotalParam().gt.0 .AND.   &
+             (calc%reactType.EQ.6 .OR. calc%reactType.EQ.9 .OR. calc%ener.NE.Zero) ) THEN
+!
+            DO Iipar=1,calc%covariance%getNumTotalParam()
+               if (.not.calc%covariance%contributes(Iipar)) continue
+               calc%termf = Zero
+               DO N=1,calc%resData%getNumSpinGroups()
+                     haveAny = .false.
+                     do i = 1, calc%ntotc+1
+                        if (calc%crossInternal(i, N, Iipar).ne.0.0d0) then
+                            haveAny = .true.
+                            exit
+                        end if
+                     end do
+                     if (.not.haveAny) cycle
+                     IF (calc%reactType.EQ.9) THEN
+                        D2aaaa(N,1) = calc%crossInternal(3, N, Iipar)
+                        D2aaaa(N,2) = calc%crossInternal(4, N, Iipar)
                      ELSE
-                        call resParData%getSpinGroupInfo(spinInfo,N)
-                        isoN = spinInfo%getIsotopeIndex()
-                        IF (IsoN.EQ.Iso .OR. Nnniso.NE.Numiso) THEN
+                        call calc%resData%getSpinGroupInfo(spinInfo,N)
+                        isoN = 1
+                        if (calc%separateIso) isoN = spinInfo%getIsotopeIndex()
+                        IF (IsoN.EQ.Iso) THEN
 ! ***                   If we're keeping the Isotopes separate, and this
 ! ***                      spin group does not belong to this Isotope,
 ! ***                      then do not include this spin group this time
-                           Dtermn = Deriv(1,Iipar,N)*   &
-                                spinInfo%getAbundance() +   &
-                                Dtermn
-                           Dterma = Deriv(2,Iipar,N)*   &
+                           do i = 1, calc%ntotc+1
+                             calc%termf(I) = calc%crossInternal(i, N, Iipar) *   &
                                 spinInfo%getAbundance() +   &
-                                Dterma
-                           IF (Ncrsss.GE.3) THEN
-                              DO I=1,Ncrsss-2
-                                 Termf(I) = Termf(I) +   &
-                                      Deriv(I+2,Iipar,N)*   &
-                                  spinInfo%getAbundance() 
-                              END DO
-                           END IF
+                                calc%termf(I)
+                           end do
                         END IF
                      END IF
-                  END IF
                END DO
                Dtermf = Zero
-               IF (Ncrsss.GE.3) THEN
-                  DO I=1,Ncrsss-2
-                     Dtermf = Dtermf + Termf(I)
-                  END DO
-               END IF
+               DO I=3, calc%ntotc + 1
+                     Dtermf = Dtermf + calc%Termf(I)
+               END DO
 !
-               IF (Dterma.NE.Zero .OR. Dtermn.NE.Zero .OR.   &
-                   Dtermf.NE.Zero .OR. Kcros.EQ.9          ) THEN
+               IF (calc%termf(2).NE.Zero .OR. calc%termf(1).NE.Zero .OR.   &
+                   Dtermf.NE.Zero .OR. calc%reactType.EQ.9          ) THEN
 !
 ! ***             total cross section
-                  IF (Kcros.EQ.1) Answer = Dtermn + Dterma
+                  IF (calc%reactType.EQ.1) Answer = calc%termf(1) + calc%termf(2)
 !
 ! ***             elastic scattering cross section
-                  IF (Kcros.EQ.2) Answer = Dtermn
+                  IF (calc%reactType.EQ.2) Answer = calc%termf(1)
 !
 ! ***             inelastic scattering or reaction or fission
-                  IF (Kcros.EQ.3 .AND. Kaptur.EQ.0) Answer=Dtermf
-                  IF (Kcros.EQ.3 .AND. Kaptur.EQ.3) Answer=Dterma-Dtermf
+!         or cross section at position 1, if we calculate eta
+                  IF (calc%reactType.EQ.3.or.calc%reactType.EQ.6) then
+                      if (.not.calc%addElimKapt) then
+                           Answer=Dtermf
+                      else
+                           Answer=calc%termf(2)-Dtermf
+                      end if
+                 end if
 !
 ! ***             capture cross section
-                  IF (Kcros.EQ.4) Answer = Dterma - Dtermf
+                  IF (calc%reactType.EQ.4)  Answer = calc%termf(2) - Dtermf
 !
 ! ***             absorption cross section
-                  IF (Kcros.EQ.5) Answer = Dterma
+                  IF (calc%reactType.EQ.5) Answer = calc%termf(2)
+
+                  ! eta: position 1: fission, position 2: absorption
+                  if (calc%reactType.EQ.6) then
+                      call  calc%crossData%addDataNs(calc%row, 2, Iipar, Iso, calc%termf(2))
+                  end if
 !
-! ***             eta
-                  IF (Kcros.EQ.6) THEN
-                     IF (Kefcap.EQ.0) THEN
-                        Answer=Etan*(Dtermf-Dterma*Termff/Terma)/Terma
-                     ELSE
-                        D = Terma*Effcap + Termff*(Efffis-Effcap)
-                        Answer = Etan/D * ( Dtermf*Efffis -   &
-                           Termff*Efffis/D* (Dterma*Effcap +   &
-                                             Dtermf*(Efffis-Effcap)) )
-                     END IF
-                  END IF
 !
 ! ***             A2
-                  IF (Kcros.EQ.9) THEN
+                  IF (calc%reactType.EQ.9) THEN
                      A2 = A2aa31*D2aaaa(1,1) + A2aa32*D2aaaa(1,2) +   &
                           A2aa41*D2aaaa(2,1) + A2aa42*D2aaaa(2,2)
                      A2x = A2aaaa(1,1) + A2aaaa(1,2) + A2aaaa(2,1) +   &
@@ -248,80 +213,19 @@
                      Answer = (A2-A2d/A2x)/A2x
                   END IF
 !
+
                   IF (Answer.NE.Zero) THEN
-                     IF (Kcros.NE.6 .AND. Kcros.NE.9) Answer =   &
-                                                      Answer*Fourpi/Su
-                     IF (Eb.LT.Zero) Answer = - Answer
-                     IF (Iipar.LE.Ndasig) THEN
-                        IF (Dasigx(1,Iipar).EQ.Zero) THEN
-                            Dasigx(1,Iipar) = Answer
-                            Isopar(Iipar) = Iso
-                        ELSE
-                            WRITE (6,12345) Iipar, Dasigx(1,Iipar)
-12345                       FORMAT ('Dasigx(1,', I3, ')=', 1PG14.6)
-                            STOP '[STOP in Prtclr in mxct19.f   # 2]'
-                       END IF
-                     ELSE
-                        IF (Dbsigx(1,Iiparn,Iso).EQ.Zero) THEN
-                            Dbsigx(1,Iiparn,Iso) = Answer
-                        ELSE
-                            WRITE (6,12346) Iipar, Iso,   &
-                               Dbsigx(1,Iiparn,Iso)
-12346                       FORMAT ('Dbsigx(1,',I3,',',I3,')=', 1PG14.6)
-                            STOP '[STOP in Prtclr in mxct19.f   # 3]'
-                        END IF
-                     END IF
-                  ELSE
-                     IF (Iipar.LE.Ndasig) THEN
-                            Isopar(Iipar) = Iso
-                     END IF
+                     IF (calc%reactType.NE.6.and.calc%reactType.NE.9) then
+                          Answer =  Answer*Fourpi/Su
+                     end if
+                     IF (calc%ener.LT.Zero.and.calc%reactType.ne.6) Answer = - Answer
+                     calc%crossSelfWhy(Iipar) = .true.
+                     call calc%crossData%addDataNs(calc%row, 1, Iipar, Iso, Answer)
                   END IF
                END IF
             END DO
-!
-            IF (Kcros.EQ.6) THEN
-               IF (Kefcap.NE.0) THEN
-                  IF (Iflmsc(Kefcap).GT.0) THEN
-                     Nd = Iflmsc(Kefcap) - Ndasig
-                     IF (Nd.LT.0) STOP '[STOP in Prtclr in mxct19.f #4]'
-                     D = F + C
-                     IF (Dbsigx(1,Nd,Iso).EQ.Zero) THEN
-                        Dbsigx(1,Nd,Iso) = - Eta*(Terma-Termff)/D
-                     ELSE
-                        STOP '[STOP in Prtclr in mxct19.f   # 5]'
-                     END IF
-                  END IF
-                  IF (Iflmsc(Keffis).GT.0) THEN
-                     Nd = Iflmsc(Keffis) -  Ndasig
-                     IF (Nd.LT.0) STOP '[STOP in Prtclr in mxct19.f #6]'
-                     D = F + C
-                     IF (Dbsigx(1,Nd,Iso).EQ.Zero) THEN
-                        Dbsigx(1,Nd,Iso) = Eta*C/(D*Efffis)
-                     ELSE
-                        STOP '[STOP in Prtclr in mxct19.f   # 7]'
-                     END IF
-                  END IF
-               END IF
-               IF (Iflmsc(K1+Kjetan-1).GT.0) THEN
-                  Nd = Iflmsc(K1+Kjetan-1) - Ndasig
-                  IF (Nd.LT.0) STOP '[STOP in Prtclr in mxct19.f   # 8]'
-                  IF (Dbsigx(1,Nd,Iso).EQ.Zero) THEN
-                     Dbsigx(1,Nd,Iso) = A1*A3
-                  ELSE
-                     STOP '[STOP in Prtclr in mxct19.f   # 8.1]'
-                  END IF
-               END IF
-               IF (K2.GT.0 .AND. Iflmsc(K2+Kjetan-1).GT.0) THEN
-                  Nd = Iflmsc(K2+Kjetan-1) - Ndasig
-                  IF (Nd.LT.0) STOP '[STOP in Prtclr in mxct19.f   # 9]'
-                  IF (Dbsigx(1,Nd,Iso).EQ.Zero) THEN
-                     Dbsigx(1,Nd,Iso) = A2*A3
-                  ELSE
-                     STOP '[STOP in Prtclr in mxct19.f   # 9.1]'
-                  END IF
-               END IF
-            END IF
-!
+
+
          END IF
    60 CONTINUE
 ! *** here we're done with choosing proper cross sections et al
@@ -331,40 +235,6 @@
 !
 ! ______________________________________________________________________
 !
-      Double Precision Function A_Interp (Su, Etanux, Etaeee, Mjetan,   &
-         A1, A2, Keta1, Keta2)
-!
-! *** Purpose -- Find A_Interp = value of Etanux (nu) at energy Su
-! ***               for this run.
-!
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Etanux(*), Etaeee(*)
-      IF (Su.LT.Etaeee(1)) THEN
-         A_Interp = Etanux(1)
-         Keta1 = 1
-         Keta2 = 0
-         A1 = 1.0d0
-         A2 = 0.0d0
-         RETURN
-      END IF
-      DO K=2,Mjetan
-         IF (Su.LT.Etaeee(K)) GO TO 10
-      END DO
-      A_Interp = Etanux(Mjetan)
-         Keta1 = Mjetan
-         Keta2 = 0
-         A1 = 1.0d0
-         A2 = 0.0d0
-      RETURN
-   10 CONTINUE
-      E1 = Etaeee(K-1)
-      E2 = Etaeee(K  )
-      De = E2 - E1
-      A1 = (E2-Su)/De
-      A2 = (Su-E1)/De
-      A = A1*Etanux(K) + A2*Etanux(K-1)
-      A_Interp = A
-      Keta1 = K - 1
-      Keta2 = K
-      RETURN
-      END
+      ! note: A_Interp moved to ZeroKCrossCorrections_M
+      !       as Eta is calculated there
+end module mxct19_m
diff --git a/sammy/src/xct/mxct20.f90 b/sammy/src/xct/mxct20.f90
index eae5434c2..f85fd5407 100644
--- a/sammy/src/xct/mxct20.f90
+++ b/sammy/src/xct/mxct20.f90
@@ -1,120 +1,140 @@
 module mxct20_m
 use XctCrossCalc_M
+!Todo: Remove global parameters
 contains
 !
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Diffel (calc, Siabnd, Jfexcl,    &
+      SUBROUTINE Diffel (calc, Siabnd,     &
                  Pardet, Ifldet, Igrdet, Iflmsc,  &
-          Sigxxx, Dasigx, Dbsigx, Sigsin, Dasigs, Dbsigs,   &
-         Isopar, Ccclll, Dddlll, Crss  , Deriv , Crssx ,   &
-         Derivx, Termf , Termfx, Echan , Cmlab , Iso_Qv, Lllmmm, Su, Eb,   &
-         Kslow)
+                 Cmlab , Iso_Qv)
 !
-! *** Purpose -- Set Ccclll(L,Iso or Iq) = coefficient of Legendre
+! *** Purpose -- Set  coefficient of Legendre
 ! ***            polynomial P-sub-(L-1) for Isotope Iso [or Q-value Iq]
 ! ***            Also set other cross sections as needed
-! ***            Also, set the derivatives to Dddlll(L,.,Iso or Iq)
+! ***            Also, set the derivatives
 !
-      use fixedi_m
-      use ifwrit_m
-      use lbro_common_m
+      use ifwrit_m, only : Ksindi
       use mxct32_m
       use mxct31_m
       use mxct22_m
       use mxct21_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use mxct23_m
+      IMPLICIT None
 !
       class(XctCrossCalc)::calc
-      DIMENSION Siabnd(*), Jfexcl(Ntotc,*),   &
-         Pardet(*), Ifldet(*), Igrdet(*), Iflmsc(*),   &
-         Sigxxx(Nnnsig,*), Dasigx(Nnnsig,*), Dbsigx(Nnnsig,Ndbxxx,*),   &
-         Sigsin(*), Dasigs(*), Dbsigs(Ndbxxx,*), Isopar(*),   &
-         Termf(*), Termfx(*), Echan(*), Cmlab(3,*), Iso_Qv(*)
-!          Sigxxx(Lllmax+1or2,Nnniso), Dasigx(ditto,Ndasig),
-!          Dbsigx(ditto,Ndbsig,Nnniso),
-!          Sigsin(Nnniso), Dasigs(Ndasig), Dbsigs(Ndbsig,Nnniso)
+      real(kind=8)::Siabnd(*), Pardet(*)
+      real(kind=8),allocatable::Cmlab(:,:)
+      integer::Ifldet(*), Igrdet(*), Iflmsc(*)
+      integer,allocatable::Iso_Qv(:)
 !
-      DIMENSION Ccclll(Lllmmm,*), Dddlll(Lllmmm,*)
-!             Ccclll(Lllmax,Numiso or Iq_Val), Dddlll(Lllmax,Ndasig)
+      logical(C_BOOL)::accu
+      integer::Iso, L, Iipar
+      real(kind=8)::Eb, val
 !
-      DIMENSION Crss(Ncrsss,*), Deriv(Ncrsss,Nnpar,*)
-      DIMENSION Crssx(2,Ntotc,Ntotc,*), Derivx(2,Ntotc,Ntotc,Nnpar,*)
 !
 !
 !
-      IF (Ifdif.NE.0) THEN
+      Eb = calc%ener
+      IF (calc%needAngular) THEN       
 !
 ! ****** first, set the Legendre coefficients:
-         IF (Kslow.EQ.0) THEN
-            CALL Setleg ( calc, Sigxxx, Ccclll,   &
-                          Crssx, Echan, Cmlab, Iso_Qv, Lllmmm, Eb)
+         IF (calc%Kslow.EQ.0) THEN
+            CALL Setleg ( calc, Cmlab, Iso_Qv)
          ELSE
-           CALL Setleg_Slow (calc, Sigxxx, Ccclll,   &
-                             Crssx, Echan, Cmlab, Iso_Qv, Lllmmm, Eb)
+           CALL Setleg_Slow (calc, Cmlab, Iso_Qv)
          END IF
-!
-         NNN = 0
-         IF (.NOT.Yangle .AND. Kfinit.EQ.0 .AND. Kssmsc.EQ.0) GO TO 20
-         IF (Nnnsig.LE.Lllmax .AND. Kfinit.GT.0) THEN
-            WRITE (6,10000) Nnnsig, Lllmax
-10000       FORMAT (' Nnnsig =', I4, '   LlLmax =', I4)
-            STOP '[STOP in Diffel in mxct20.f   # 1]'
-         END IF
-!
       END IF
 !
 !
-      IF (Ncrssx.NE.0) THEN
+      IF (any(calc%Ifcros)) THen
 !
 ! ****** set the cross sections (non-angle-differential):
 ! ****** beginning with self-indication transmission
-         IF (Ksindi.GT.0 .AND. Kcros.EQ.8) CALL Setsel (calc, Siabnd,    &
-               Sigsin, Crss, Su, Eb)
+         IF (Ksindi.GT.0 .AND. calc%reactType.EQ.8) then
+            CALL Setsel (calc, Siabnd)
+         end if
 !
 !
 ! ****** now do other terms
-         CALL Setoth (calc, Pardet, Igrdet,   &
-                      Sigxxx, Crss, Termf, Termfx, Su, Eb)
+         CALL Setoth (calc, Pardet, Igrdet)
       END IF
 !
    20 CONTINUE
 !
 !
 ! *** Now, set the derivatives (if needed)
-      IF (Ndasig+Ndbsig.LE.0) RETURN
-!
-      IF (Ifdif.NE.0) THEN
-! ****** first, derivatives of Legendre coefficients
-         IF (Ndasig.GT.0) THEN
-            IF (Kslow.EQ.0) THEN
-               CALL Derleg (  calc,  &
-                  Sigxxx, Dasigx, Ccclll, Dddlll, Crssx,   &
-                  Derivx, Isopar, Echan, Cmlab, Iso_Qv, Lllmmm, Eb)
+      IF (calc%covariance%getNumTotalParam().LE.0) then
+         IF (calc%needAngular) THEN  ! correct angular cross section for 1/Eb
+            accu = .false.
+            call calc%crossData%setAccumulate(accu)
+            DO Iso=1,calc%numIso
+               DO L=1,calc%Lllmax
+                 val = calc%crossData%getDataNs(calc%row, L, 0, Iso)
+                 if (val.eq.0.0d0) cycle
+                 val = val/Eb
+                 call calc%crossData%addDataNs(calc%row, L, 0, Iso, val)
+               END DO
+            END DO
+            accu = .true.
+            call calc%crossData%setAccumulate(accu)
+         end if
+         return
+      end if
+!
+      IF (calc%needAngular) THEN
+! ****** first, derivatives of Legendre coefficients       
+         IF (calc%hasParams) THEN
+            IF (calc%Kslow.EQ.0) THEN
+               CALL Derleg(calc,  Cmlab, Iso_Qv)
             ELSE
-               CALL Derleg_Slow (  calc,  &
-                  Sigxxx, Dasigx, Ccclll, Dddlll,    &
-                  Crssx, Derivx, Isopar, Echan, Cmlab, Iso_Qv, Lllmmm,   &
-                  Eb)
+               CALL Derleg_Slow(calc, Cmlab, Iso_Qv)
             END IF
          END IF
-         IF (.NOT.Yangle .AND. Kfinit.EQ.0 .AND. Kssmsc.EQ.0) RETURN
+
+         ! correct angular cross section and derivative for 1/Eb
+         accu = .false.
+         call calc%crossData%setAccumulate(accu)
+         DO Iso=1,calc%numIso
+            DO L=1,calc%Lllmax
+              val = calc%crossData%getDataNs(calc%row, L, 0, Iso)
+              if (val.eq.0.0d0) cycle
+              val = val/Eb
+              call calc%crossData%addDataNs(calc%row, L, 0, Iso, val)
+            END DO
+         END DO
+
+         if( calc%hasParams) then
+            accu = .true.
+            call calc%crossData%setNotSetReturnsZero(accu)
+            DO Iipar=1,calc%covariance%getNumTotalParam()
+              DO L=1,calc%Lllmax
+                 val = calc%crossData%getSharedValNs(calc%row, L, Iipar)
+                 if (val.eq.0.0d0) cycle
+                 val = val/Eb
+                 call calc%crossData%setSharedValNs(calc%row, L, Iipar, val)
+              END DO
+            END DO
+            accu = .false.
+            call calc%crossData%setNotSetReturnsZero(accu)
+         end if
+
+         accu = .true.
+         call calc%crossData%setAccumulate(accu)
+
       END IF
 !
-      IF (Yangle .AND. Kfinit.LE.0) RETURN
-!
-      IF (Ncrssx.NE.0) THEN
+      IF (any(calc%Ifcros)) THEN
 !
 ! ****** Now, the derivatives of the angle-integrated cross sections
 ! ******    beginning with self-indication transmission
-         IF (Ksindi.GT.0 .AND. Kcros.EQ.8) call Dersel (Siabnd,   &
-            Iflmsc, Dasigs, Dbsigs, Crss, Deriv, Isopar, Su, Eb)
+         IF (Ksindi.GT.0 .AND. calc%reactType.EQ.8) then
+            call Dersel (calc, Siabnd,  Iflmsc)
+         end if
 !
 ! ****** Now derivatives of the other cross sections
-         CALL Deroth (Pardet, Ifldet,   &
-            Igrdet, Iflmsc, Dasigx, Dbsigx,   &
-            Crss, Deriv, Isopar, Termf, Termfx, Su, Eb)
+         CALL Deroth (calc, Pardet, Ifldet, Igrdet, Iflmsc)
 !
       END IF
    40 CONTINUE
diff --git a/sammy/src/xct/mxct21.f90 b/sammy/src/xct/mxct21.f90
index 10cfa6512..0db8e1fc6 100644
--- a/sammy/src/xct/mxct21.f90
+++ b/sammy/src/xct/mxct21.f90
@@ -4,6 +4,8 @@ IMPLICIT NONE
 
 private Jxnnn, Jxmmm
 
+! Todo: Don't use global parameters  Iq_Iso, Iq_Val
+
 contains
     integer function Jxnnn (Nb,Na,N, Ntotc, Ngroup)
        integer Nb,Na,N, Ntotc, Ngroup
@@ -19,27 +21,22 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Setleg (calc, Sigxxx, Ccclll,   &
-                        Crssx, Echan, Cmlab, Iso_Qv, Lllmmm, Eb)
+      SUBROUTINE Setleg (calc, Cmlab, Iso_Qv)
 !
-! *** Purpose -- set Ccclll(L,Iso) = coefficient of Legendre polynomial
+! *** Purpose -- set  coefficient of Legendre polynomial
 ! ***                         P-sub-(L-1) for Isotope Iso
 !
-      use fixedi_m, only : Nnnsig, Kkxlmn, Ntotc, Iq_Iso, Iq_Val, Lllmax, Nnniso, Numiso
+      use fixedi_m, only : Iq_Iso, Iq_Val
       use SammySpinGroupInfo_M
       use mdat9_m
 
 !
       type(XctCrossCalc)::calc
-      real(kind=8)::    &
-         Sigxxx(Nnnsig,*), Ccclll(Lllmmm,*),   &
-         Crssx(2,Ntotc,Ntotc,*), Echan(Ntotc,*), Cmlab(3,*)
-      integer::    Iso_Qv(*)
+      real(kind=8),allocatable::   Cmlab(:,:)
+      integer,allocatable::    Iso_Qv(:)
       type(SammySpinGroupInfo)::spinMgr, spinNgr
       real(kind=8),parameter::Zero = 0.0d0
-      integer::Lllmmm
-      real(kind=8)::Eb
-      real(kind=8)::Ai, Ar, Br, C2
+      real(kind=8)::Ai, Ar, Br, C2, val
       integer::Iq, Iso, isoMgr, isoNgr, Jx, Jxm, Jxn, Klmn, Kountr
       integer::L, Mchan, Mchanx, Mgr, Nchan, Nchanx, Ngr
       integer::ngroup
@@ -47,8 +44,7 @@ contains
 !
       ngroup = calc%resData%getNumSpinGroups()
 
-      CALL Zero_Array (Ccclll, Iq_Iso*Lllmax)
-      CALL Findpr (Kkxlmn, Klmn)
+      CALL Findpr (calc%C_G_Kxlmn, Klmn)
 !
       DO Iq=1,Iq_Iso
          IF (Iq_Val.NE.0) THEN
@@ -60,112 +56,104 @@ contains
          END IF
          DO Ngr=1,calc%resData%getNumSpinGroups()
             call calc%resData%getSpinGroupInfo(spinNgr, Ngr)
-            IF (spinNgr%getIncludeInCalc()) THEN               
-               isoNgr = spinNgr%getIsotopeIndex() 
-               IF (IsoNgr.EQ.Iso .OR. Nnniso.NE.Numiso) THEN
-! ***             If we're keeping isotopes separate, and this is the
-! ***                wrong isotope, then don't do this one now
-                  DO Nchan=1,spinNgr%getNumChannels()
-                     IF ((Iq_Val.NE.0 .AND. Echan(Nchan,Ngr).EQ.C2) .OR.   &
-                        Iq_Val.EQ.0) THEN
-                        DO Nchanx=1,spinNgr%getNumEntryChannels()
-                           Ar = Crssx(1,Nchanx,Nchan,Ngr)
-                           Ai = Crssx(2,Nchanx,Nchan,Ngr)
-! ***                      Ar & Ai are zero when Nchan is not an
-! ***                         included channel for the particular
-! ***                         reaction under consideration
-                           IF (Ar.NE.Zero .OR. Ai.NE.Zero) THEN
-! --------------------------------------------------------------------
-         Jxn = Jxnnn (Nchanx,Nchan,Ngr, Ntotc, Ngroup)
-         DO Mgr=1,calc%resData%getNumSpinGroups()
-            call calc%resData%getSpinGroupInfo(spinMgr, Mgr)
-            IF (spinMgr%getIncludeInCalc()) THEN   
-               isoMgr = spinMgr%getIsotopeIndex() 
-               IF (IsoMgr.EQ.Iso .OR. Nnniso.NE.Numiso) THEN
-! ***             If we're keeping isotopes separate, and this
-! ***                is the wrong isotope, then don't do this one
-                  DO Mchan=1,spinMgr%getNumChannels()
-                     IF (Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
-                        Echan(Mchan,Mgr).EQ.C2)) THEN
+            IF (.not.spinNgr%getIncludeInCalc()) cycle
+            isoNgr = 1
+            if (calc%separateIso)  isoNgr = spinNgr%getIsotopeIndex()
+            IF (IsoNgr.ne.Iso) cycle
+            ! ***             If we're keeping isotopes separate, and this is the
+            ! ***                wrong isotope, then don't do this one now
+            DO Nchan=1,spinNgr%getNumChannels()
+               IF (.not. ((Iq_Val.NE.0 .AND. calc%Echan(Nchan,Ngr).EQ.C2) .OR.   &
+                    Iq_Val.EQ.0)) cycle
+               DO Nchanx=1,spinNgr%getNumEntryChannels()
+                  Ar = calc%angInternal(1,Nchanx,Nchan,Ngr, 0)
+                  Ai = calc%angInternal(2,Nchanx,Nchan,Ngr, 0)
+                  ! ***                      Ar & Ai are zero when Nchan is not an
+                  ! ***                         included channel for the particular
+                  ! ***                         reaction under consideration
+                  IF (Ar.eq.Zero .and. Ai.eq.Zero) cycle
+                  ! --------------------------------------------------------------------
+                  Jxn = Jxnnn (Nchanx,Nchan,Ngr, calc%Ntotc, Ngroup)
+                  DO Mgr=1,calc%resData%getNumSpinGroups()
+                     call calc%resData%getSpinGroupInfo(spinMgr, Mgr)
+                     IF (.not.spinMgr%getIncludeInCalc()) cycle
+                     isoMgr = 1
+                     if (calc%separateIso) isoMgr = spinMgr%getIsotopeIndex()
+                     IF (IsoMgr.ne.Iso) cycle
+                     ! ***             If we're keeping isotopes separate, and this
+                     ! ***                is the wrong isotope, then don't do this one
+                     DO Mchan=1,spinMgr%getNumChannels()
+                        IF (.not.(Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
+                             calc%Echan(Mchan,Mgr).EQ.C2))) cycle
                         DO Mchanx=1,spinMgr%getNumEntryChannels()
-                           Br = Ar*Crssx(1,Mchanx,Mchan,Mgr) +   &
-                                Ai*Crssx(2,Mchanx,Mchan,Mgr)
-                           IF (Br.NE.Zero) THEN
-                              Jxm = Jxmmm (Mchanx,Mchan,Mgr,Jxn, Ntotc, Lllmax)
-                              DO L=1,Lllmax
-                                 Jx = Jxm + L
-                                 CALL Find_Kountr_Jx (calc%Ixlmn(:,1), Kkxlmn,   &
-                                    Jx, Kountr, Klmn)
-                                 IF (Kountr.GT.0) THEN
-                                    IF (calc%Xlmn(Kountr).NE.Zero)   &
-                                       Ccclll(L,Iq) = Ccclll(L,Iq) +   &
-                                       Br*calc%Xlmn(Kountr)
-                                 END IF
-                              END DO
-                           END IF
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-! --------------------------------------------------------------------
-                           END IF
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-      END DO
-!
-! *** note that Xlmn includes Abndnc; ergo so do Ccclll etc
-      DO Iso=1,Iq_Iso
-         DO L=1,Lllmmm
-            Sigxxx(L,Iso) = Ccclll(L,Iso)/Eb
-         END DO
-      END DO
+                           Br = Ar*calc%angInternal(1,Mchanx,Mchan,Mgr, 0) +   &
+                                Ai*calc%angInternal(2,Mchanx,Mchan,Mgr, 0)
+                           IF (Br.eq.Zero) cycle
+                           Jxm = Jxmmm (Mchanx,Mchan,Mgr,Jxn, calc%Ntotc, calc%Lllmax)
+                           DO L=1,calc%Lllmax
+                              Jx = Jxm + L
+                              CALL Find_Kountr_Jx (calc%Ixlmn(:,1), calc%C_G_Kxlmn,   &
+                                   Jx, Kountr, Klmn)
+                              IF (Kountr.GT.0) THEN
+                                 IF (calc%Xlmn(Kountr).NE.Zero)   then
+                                    val = Br*calc%Xlmn(Kountr)
+                                    ! note that Xlmn includes Abndnc; ergo so do calc%crossData% etc
+                                    ! not corrected for 1/energy yet
+                                    if (val.ne.0.0d0) then
+                                       call calc%crossData%addDataNs(calc%row, L, 0, Iq, val)
+                                    end if
+                                 end if
+                              END IF
+                           END DO ! loop over legender order
+                        END DO ! inner loop over entry channels (Mgr)
+                     END DO ! inner loop over channels (Mgr)
+                  END DO  ! inner loop over spin groups (Mgr)
+               END DO ! end loop over entry channels (Ngr)
+            END DO ! end loop over channels (Ngr)
+         END DO ! end loop over spin groups (Ngr)
+      END DO  ! end loop over calc%numIso
+
       RETURN
-      END
+      END subroutine
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Setsel (calc, Siabnd,  Sigsin, Crss, Su, Eb)
+      SUBROUTINE Setsel (calc, Siabnd)
 !
 ! *** Purpose -- set self-indication transmission if needed
 !
-      use fixedi_m, only : Ncrsss, Numiso, Numpmc
       use constn_common_m, only : Fourpi
       use SammySpinGroupInfo_M
-      use paramagnetic_cross_m
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
       class(XctCrossCalc)::calc
       real(kind=8)::Siabnd(*)
-      real(kind=8)::Sigsin(*)
-      real(kind=8)::Crss(Ncrsss,*)
-      real(kind=8)::Su, Eb
       type(SammySpinGroupInfo)::spinInfo
+      real(kind=8)::val
       real(kind=8), parameter::Zero=0.0d0
       integer::Iso, isoN, N, Nnnnis
 !
 !
-      Nnnnis = Numiso
+      Nnnnis = calc%resData%getNumIso()
       IF (Nnnnis.EQ.0) Nnnnis = 1
       DO Iso=1,Nnnnis
          Sitota = Zero
          DO N=1,calc%resData%getNumSpinGroups()
             call calc%resData%getSpinGroupInfo(spinInfo, N)
             IF (spinInfo%getIncludeInCalc()) THEN
-               isoN = spinInfo%getIsotopeIndex()
-               IF (Numiso.GT.0 .AND. IsoN.EQ.Iso) THEN
+               isoN = 1
+               if (calc%separateIso) isoN = spinInfo%getIsotopeIndex()
+               IF (IsoN.EQ.Iso) THEN
                   Ab = Siabnd(N)
-                  Sitota = Sitota + Ab*(Crss(1,N)+Crss(2,N))
+                  val = calc%crossInternal(1, N, 0) + &
+                        calc%crossInternal(2, N, 0)
+                  Sitota = Sitota + Ab*val
                END IF
             END IF
          END DO
-         Sigsin(Iso) = Sigsin(Iso) + Sitota*Fourpi/Eb        
+         val = Sitota*Fourpi/calc%ener
+         call calc%crossDataSelf%addDataNs(calc%row, 1, 0, iso, val)
       END DO
       RETURN
       END
@@ -173,116 +161,107 @@ contains
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Setoth ( calc, Pardet,   &
-         Igrdet, Sigxxx, Crss, Termf, Termfx, Su, Eb)
+      SUBROUTINE Setoth ( calc, Pardet, Igrdet)
 !
 ! *** Purpose -- Set "other" cross sections as needed
 !
-      use fixedi_m, only : Nnnsig, Ncrsss, Lllmax, Nnniso, Numdet, Numiso, Numpmc
-      use ifwrit_m, only : Kaverg, Kssmsc, Nfissl, Ntgrlq, Kcros, Kfinit
-      use lbro_common_m, only : Yangle
+      use fixedi_m, only : Numdet
+      use ifwrit_m, only : Nfissl
       use constn_common_m, only : Fourpi
       use SammySpinGroupInfo_M
       use paramagnetic_cross_m
 !
       class(XctCrossCalc)::calc
-      real(kind=8):: Pardet(*),    &
-           Sigxxx(Nnnsig,*), Crss(Ncrsss,*), Termf(*), Termfx(*)
+      real(kind=8):: Pardet(*)
       integer:: Igrdet(*)
       type(SammySpinGroupInfo)::spinInfo
       real(kind=8),parameter::Zero = 0.0d0
-      real(kind=8)::Su, Eb, Val
-      real(kind=8)::abnSpin, Terma, Termax, Termff, Termn, Termxx
-      integer::I, Iso, Isox, N, Nnn, isoN
+      real(kind=8)::Eb, Total, cross
+      real(kind=8)::abnSpin, Termff,  Termxx
+      integer::I, Iso, Isox, N, Nnn, isoN, Nnnsig
 !
 !
-      Nnn = Lllmax + 1
-      DO Iso=1,Nnniso
+      Nnn = calc%Lllmax + 1
+      Eb = calc%ener
+      Nnnsig = calc%crossData%getNnnsig()
+      DO Iso=1,calc%numIso
 !
-         Termn = Zero
-         Terma = Zero
-         Termax = Zero
          Termff = Zero
          Termxx = Zero
-         IF (Ncrsss.GE.3) THEN
-            DO I=1,Ncrsss-2
-               Termf(I) = Zero
-               Termfx(I) = Zero
-            END DO
-         END IF
+         calc%termf = Zero
+         calc%termfx = Zero
          DO N=1,calc%resData%getNumSpinGroups()
             call calc%resData%getSpinGroupInfo(spinInfo, N)
             IF (spinInfo%getIncludeInCalc()) THEN
-               isoN= spinInfo%getIsotopeIndex()
+               isoN = 1
+               if (calc%separateIso) isoN= spinInfo%getIsotopeIndex()
                abnSpin = spinInfo%getAbundance()
-               IF (IsoN.EQ.Iso .OR. Nnniso.NE.Numiso) THEN
+               IF (IsoN.EQ.Iso) THEN
 ! ***             If we're keeping spin groups separate, and this is the
 ! ***                wrong spin group, then don't do this One now
-                  Termn = Crss(1,N)*AbnSpin + Termn
-                  Terma = Crss(2,N)*AbnSpin + Terma
-                  IF (Ncrsss.GE.3) THEN
-                     DO I=1,Ncrsss-2
-                        Termf(I) = Crss(I+2,N)*AbnSpin + Termf(I)
-                     END DO
-                  END IF
+                  DO I=1,calc%ntotc+1
+                     calc%termf(I) = calc%crossInternal(I, N, 0)*AbnSpin + calc%Termf(I)
+                  end do
                   IF (Numdet.GT.0) THEN
-                     Termax = Termax +   &
-                        Crss(2,N)*AbnSpin*Pardet(Igrdet(N))
-                     IF (Ncrsss.GE.3) THEN
-                        DO I=1,Ncrsss-2
-                           Termfx(I) = Termfx(I) +   &
-                             Crss(3,N)*AbnSpin*Pardet(Igrdet(N))
-                        END DO
-                     END IF
+                     do I = 2, calc%ntotc+1
+                        calc%termfx(I)= calc%termfx(I) + &
+                           calc%crossInternal(I, N, 0)*AbnSpin*Pardet(Igrdet(N))
+                     end do
                   END IF
                END IF
             END IF
          END DO
-         IF (Ncrsss.GE.3) THEN
-            DO I=1,Ncrsss-2
-               Termff = Termff + Termf(I)
-               Termxx = Termxx + Termfx(I)
-            END DO
-         END IF
+         do I = 3, calc%ntotc+1
+            Termff = Termff + calc%termf(I)
+            Termxx = Termxx + calc%termfx(I)
+         end do
 !
 !
-         IF ((Ntgrlq.NE.0 .OR. Kssmsc.NE.0 .OR. Yangle .OR. Kaverg.EQ.2)   &
-            .AND. (.NOT.Yangle .OR. Kfinit.GT.0) )THEN
 !
 ! ***       total cross section
-            Sigxxx(Nnn,Iso) = (Termn+Terma)*Fourpi/Eb
+            Total = (calc%termf(1)+calc%termf(2))*Fourpi/Eb
+            cross = Total
             Isox = Iso
 !
 ! ***       elastic scattering cross section
-            IF (Kcros.EQ.2) Sigxxx(Nnnsig,Iso) = Termn*Fourpi/Eb
+            IF (calc%reactType.EQ.2) then
+                cross = calc%termf(1)*Fourpi/Eb
+            end if
 !
 ! ***       inelastic scattering cross section, or fission
-            IF (Kcros.EQ.3) THEN
+            IF (calc%reactType.EQ.3) THEN
                IF (Numdet.EQ.0) THEN
-                  Sigxxx(Nnnsig,Iso) = Termff*Fourpi/Eb
+                  cross = Termff*Fourpi/Eb
                ELSE
-                  Sigxxx(Nnnsig,Iso) = Termxx*Fourpi/Eb
-               END IF
+                 cross = Termxx*Fourpi/Eb
+               END IF          
             END IF
 !
 ! ***       capture cross section
-            IF (Kcros.EQ.4 .OR. Kcros.EQ.8) THEN
+            IF (calc%reactType.EQ.4 .OR. calc%reactType.EQ.8) THEN
                IF (Numdet.EQ.0) THEN
-                  Sigxxx(Nnnsig,Iso) = (Terma-Termff)*Fourpi/Eb
+                  cross = (calc%termf(2)-Termff)*Fourpi/Eb
                ELSE
-                  Sigxxx(Nnnsig,Iso) = (Termax-Termxx)*Fourpi/Eb
-               END IF
+                  cross = (calc%termfx(2)-Termxx)*Fourpi/Eb
+               END IF               
             END IF
 !
-! ***       fission cross section for integral quantities
-            IF (Kcros.EQ.10 .AND. Nfissl.EQ.1) Sigxxx(Nnn,Iso) =   &
-                                                        Termff*Fourpi/Eb
+! ***       fission cross section for integral quantities            
+            IF (calc%reactType.EQ.10 .AND. Nfissl.EQ.1) then
+                total = Termff*Fourpi/Eb
+           end if
 !
 ! ***       absorption cross section (maybe for integral quantities)
-            IF (Kcros.EQ.5 .OR. Kcros.EQ.10) Sigxxx(Nnnsig,Iso) =   &
-                                                         Terma*Fourpi/Eb
+            IF (calc%reactType.EQ.5 .OR. calc%reactType.EQ.10) then
+                cross = calc%termf(2)*Fourpi/Eb
+            end if
+
+            if (Nnn.ne.Nnnsig) then
+               call calc%crossData%addDataNs(calc%row, Nnn, 0, Iso, total)
+            end if
+
+            call calc%crossData%addDataNs(calc%row, Nnnsig, 0, Iso, cross)
 !
-         END IF
       END DO
       RETURN
       END
diff --git a/sammy/src/xct/mxct22.f90 b/sammy/src/xct/mxct22.f90
index 481181436..5320df1bd 100644
--- a/sammy/src/xct/mxct22.f90
+++ b/sammy/src/xct/mxct22.f90
@@ -1,178 +1,168 @@
 module mxct22_m
-use XctCrossCalc_M
-implicit none
+  use XctCrossCalc_M
+  implicit none
 
-private Jxnnn, Jxmmm
+  private Jxnnn, Jxmmm
+
+! Todo: Don't use global parameters  Iq_Iso, Iq_Val
 contains
 
-     integer function Jxnnn (Nb,Na,N, Ntotc, Ngroup)
-        integer Nb,Na,N, Ntotc, Ngroup
+  integer function Jxnnn (Nb,Na,N, Ntotc, Ngroup)
+    integer Nb,Na,N, Ntotc, Ngroup
+
+    Jxnnn = (((N-1)*Ntotc+Na-1)*Ntotc+Nb-1)*Ngroup - 1
+  end function Jxnnn
+  integer function Jxmmm (Mb,Ma,M,J, Ntotc, Lllmax)
+    integer Mb,Ma,M,J, Ntotc, Lllmax
+
+    Jxmmm   = (((J+M)*Ntotc+Ma-1)*Ntotc+Mb-1)*Lllmax
+  end function Jxmmm
+
+  ! Note :
+  ! Derleg and Derleg_slow are almost identical
+  ! except for the calls to Jxnnn, Jxmm and
+  ! Find_Kountr_Jx and Find_Kountr_Jx_Slow
+  ! all related to find data in  calc%Xlmn
+
 
-        Jxnnn = (((N-1)*Ntotc+Na-1)*Ntotc+Nb-1)*Ngroup - 1
-     end function
-     integer function Jxmmm (Mb,Ma,M,J, Ntotc, Lllmax)
-        integer Mb,Ma,M,J, Ntotc, Lllmax
+  !
+  !
+  ! ______________________________________________________________________
+  !
+  SUBROUTINE Derleg (calc,  Cmlab, Iso_Qv)
+    !
+    ! *** Purpose -- Set  Derivative of coefficient of
+    ! ***                  Legendre polynomial P-sub-(L-1) for Isotope Iso
+    ! ***
+    ! *** Note    -- Enter this routine only if we want derivatives
+    !
+    use fixedi_m, only : Iq_Iso, Iq_Val
+    use SammySpinGroupInfo_M
+    use SammyIsoInfo_M
+    use mdat9_m
+    use mxct21_m
+    !
+    class(XctCrossCalc)::calc
+    real(kind=8),allocatable::  Cmlab(:,:)
+    integer,allocatable::  Iso_Qv(:)
+    type(SammySpinGroupInfo)::spinMgr, spinNgr
+    type(SammyIsoInfo)::isoInfo
+    real(kind=8),parameter:: Zero = 0.0d0
+    real(kind=8)::val
+    real(kind=8)::Ai, Ar, Bi, Br, C2, Dai, Dar, Dbi, Dbr, Dr
+    integer::Ifl, Iipar, Iq, Iso, IsoMgr, isoNgr, Jx, Jxm, Jxn
+    integer::Klmn, Kountr, Mchan, Mchanx,  Mgr, Nchan, Nchanx
+    integer::Ngr, L
+    integer::ngroup
+    !
+    ngroup = calc%resData%getNumSpinGroups()
+    CALL Findpr (calc%C_G_Kxlmn, Klmn)
+    !
+    DO Iq=1,Iq_Iso
+       IF (Iq_Val.NE.0) THEN
+          Iso = Iso_Qv(Iq)
+          C2 = Cmlab(2,Iq)
+       ELSE
+          Iso = Iq
+          C2 = Zero
+       END IF
+       DO Ngr=1,calc%resData%getNumSpinGroups()
+          call calc%resData%getSpinGroupInfo( spinNgr, Ngr)
+          IF (.not.spinNgr%getIncludeInCalc()) cycle
+          isoNgr = 1
+          if (calc%separateIso) isoNgr =  spinNgr%getIsotopeIndex()
+          IF (isoNgr.ne.Iso) cycle
+          ! ***          If we're keeping spin groups separate, and this is the
+          ! ***             wrong spin group, then don't do this one now
+          DO Nchan=1,spinNgr%getNumChannels()
+             IF (.not.((Iq_Val.NE.0 .AND. calc%Echan(Nchan,Ngr).EQ.C2) .OR.   &
+                  Iq_Val.EQ.0)) cycle
+             DO Nchanx=1,spinNgr%getNumEntryChannels()
+                Ar = calc%angInternal(1,Nchanx,Nchan,Ngr, 0)
+                Ai = calc%angInternal(2,Nchanx,Nchan,Ngr, 0)
+                IF (Ar.eq.Zero .and. Ai.eq.Zero) cycle
+                Jxn = Jxnnn (Nchanx,Nchan,Ngr, calc%Ntotc, Ngroup)
+                DO Mgr=1,calc%resData%getNumSpinGroups()
+                   call calc%resData%getSpinGroupInfo( spinMgr, Mgr)
+                   IF (.not.spinMgr%getIncludeInCalc()) cycle
+                   isoMgr = 1
+                   if (calc%separateIso) isoMgr = spinMgr%getIsotopeIndex()
+                   IF (IsoMgr.ne.Iso) cycle
+                   ! ***          If we're keeping spin groups separate, and this is the wrong
+                   ! ***             spin group, then don't do this one
+                   DO Mchan=1,spinMgr%getNumChannels()
+                      IF (.not.(Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
+                           calc%Echan(Mchan,Mgr).EQ.C2))) cycle
+                      DO Mchanx=1,spinMgr%getNumEntryChannels()
+                         Br = calc%angInternal(1,Mchanx,Mchan,Mgr, 0)
+                         Bi = calc%angInternal(2,Mchanx,Mchan,Mgr, 0)
+                         Jxm = Jxmmm (Mchanx,Mchan,Mgr,Jxn, calc%Ntotc, calc%Lllmax)
+                         DO Iipar=1,calc%covariance%getNumTotalParam()
+                            Dar = calc%angInternal(1,Nchanx,Nchan,Ngr, Iipar)
+                            Dai = calc%angInternal(2,Nchanx,Nchan,Ngr, Iipar)
+                            IF (Dar.NE.Zero .OR. Dai.NE.Zero) THEN
+                               calc%crossSelfWhy(Iipar) = .true.
+                               Dr = Br*Dar + Bi*Dai
+                            ELSE
+                               Dr = Zero
+                            END IF
+                            Dbr = calc%angInternal(1,Mchanx,Mchan,Mgr, Iipar)
+                            Dbi = calc%angInternal(2,Mchanx,Mchan,Mgr, Iipar)
+                            IF (Dbr.NE.Zero .OR. Dbi.NE.Zero) THEN
+                               calc%crossSelfWhy(Iipar) = .true.
+                               Dr = Ar*Dbr + Ai*Dbi + Dr
+                            END IF
+                            IF (Dr.eq.Zero) cycle
+                            DO L=1,calc%Lllmax
+                               Jx = Jxm + L
+                               CALL Find_Kountr_Jx (calc%Ixlmn(:,1), calc%C_G_Kxlmn, Jx,   &
+                                    Kountr, Klmn)
+                               IF (Kountr.GT.0) THEN
+                                  IF (calc%Xlmn(Kountr).NE.Zero) THEN
+                                     val = Dr*calc%Xlmn(Kountr)
+                                     if (val.ne.0.0d0) then
+                                        call calc%crossData%setSharedValNs(calc%row, L, Iipar, val)
+                                     end if
+                                  END IF
+                               END IF
+                            END DO ! loop over legender order
+                         END DO ! loop over parameters
+                      END DO ! inner loop over entry channels (Mgr)
+                   END DO ! inner loop over channels (Mgr)
+                END DO  ! inner loop over spin groups (Mgr)
+             END DO ! end loop over entry channels (Ngr)
+          END DO ! end loop over channels (Ngr)
+       END DO ! end loop over spin groups (Ngr)       
+    END DO ! end loop over calc%numIso
 
-        Jxmmm   = (((J+M)*Ntotc+Ma-1)*Ntotc+Mb-1)*Lllmax
-     end function
+    !
+    ! *** find derivative of Crss wrt isotopic Abundance
+    ! Always calculate
+    ! ##################### maybe NOT CORRECT YET FOR Iq_Val>0
+    !
+    ! DAW todo: This still does not seem correct for
+    !           if  number of real isotopes > 1
+    DO Iq=1, calc%numIso
+       IF (Iq_Val.NE.0) THEN
+          Iso = Iso_Qv(Iq)
+       ELSE
+          Iso = Iq
+       END IF
+       call calc%resData%getIsoInfo(isoInfo, Iso)
+       Ifl = isoInfo%getFitOption()
+       IF (Ifl.GT.0) THEN  
+          calc%crossSelfWhy(Ifl) = .true.
+          DO L=1,calc%Lllmax
+             val = calc%crossData%getDataNs(calc%row, L, 0, Iq)
+             if (val.eq.0.0d0) cycle
+             val = val/calc%resData%getAbundanceByIsotope(Iso)
+             call calc%crossData%setSharedValNs(calc%row, L, Ifl, val)
+          END DO
+       END IF
+    END DO
 
-!
-!
-! ______________________________________________________________________
-!
-      SUBROUTINE Derleg (calc,   &
-         Sigxxx, Dasigx, Ccclll, Dddlll, Crssx,   &
-         Derivx, Isopar, Echan, Cmlab, Iso_Qv, Lllmmm, Eb)
-!
-! *** Purpose -- Set Dddlll(L,.,Iso) = Derivative of coefficient of
-! ***                  Legendre polynomial P-sub-(L-1) for Isotope Iso
-! ***
-! *** Note    -- Enter this routine only if Ndasig > 0
-!
-      use fixedi_m, only : Nnnsig, Kkxlmn, Ntotc, Iq_Iso, Iq_Val, Lllmax, Ndasig, &
-                           Nfpiso, Nnniso, Numiso
-      use ifwrit_m, only : Nnpar
-      use SammySpinGroupInfo_M
-      use SammyIsoInfo_M
-      use mdat9_m
-      use mxct21_m
-!
-      class(XctCrossCalc)::calc
-      integer::Lllmmm
-      real(kind=8)::Eb
-      real(kind=8):: &
-         Sigxxx(Nnnsig,*),   &
-         Dasigx(Nnnsig,*), Ccclll(Lllmmm,*), Dddlll(Lllmmm,*),   &
-         Crssx(2,Ntotc,Ntotc,*),   &
-         Derivx(2,Ntotc,Ntotc,Nnpar,*),   &
-         Echan(Ntotc,*), Cmlab(3,*)
-      integer::  Isopar(*),  Iso_Qv(*)
-      type(SammySpinGroupInfo)::spinMgr, spinNgr
-      type(SammyIsoInfo)::isoInfo
-      real(kind=8),parameter:: Zero = 0.0d0
-      real(kind=8)::val
-      real(kind=8)::Ai, Ar, Bi, Br, C2, Dai, Dar, Dbi, Dbr, Dr
-      integer::Ifl, Iipar, Iq, Iso, IsoMgr, isoNgr, Jx, Jxm, Jxn
-      integer::Klmn, Kountr, Mchan, Mchanx,  Mgr, Nchan, Nchanx
-      integer::Ngr, L
-      integer::ngroup
-!
-      ngroup = calc%resData%getNumSpinGroups()
-      CALL Zero_Array (Dddlll, Lllmmm*Ndasig)
-      CALL Findpr (Kkxlmn, Klmn)
-!
-      DO Iq=1,Iq_Iso
-         IF (Iq_Val.NE.0) THEN
-            Iso = Iso_Qv(Iq)
-            C2 = Cmlab(2,Iq)
-         ELSE
-            Iso = Iq
-            C2 = Zero
-         END IF
-         DO Ngr=1,calc%resData%getNumSpinGroups()
-            call calc%resData%getSpinGroupInfo( spinNgr, Ngr)
-            IF (spinNgr%getIncludeInCalc()) THEN
-               isoNgr =  spinNgr%getIsotopeIndex()
-               IF (Numiso.LE.0 .OR. isoNgr.EQ.Iso .OR.   &
-                  Nnniso.NE.Numiso) THEN
-! ***          If we're keeping spin groups separate, and this is the
-! ***             wrong spin group, then don't do this one now
-                  DO Nchan=1,spinNgr%getNumChannels()
-                     IF ((Iq_Val.NE.0 .AND. Echan(Nchan,Ngr).EQ.C2) .OR.   &
-                        Iq_Val.EQ.0) THEN
-                        DO Nchanx=1,spinNgr%getNumEntryChannels()
-                           Ar = Crssx(1,Nchanx,Nchan,Ngr)
-                           Ai = Crssx(2,Nchanx,Nchan,Ngr)
-                           IF (Ar.NE.Zero .OR. Ai.NE.Zero) THEN
-! ----------------------------------------------------------
-         Jxn = Jxnnn (Nchanx,Nchan,Ngr, Ntotc, Ngroup)
-         DO Mgr=1,calc%resData%getNumSpinGroups()
-            call calc%resData%getSpinGroupInfo( spinMgr, Mgr)
-            IF (spinMgr%getIncludeInCalc()) THEN               
-               isoMgr = spinMgr%getIsotopeIndex()
-               IF (Numiso.LE.0 .OR. IsoMgr.EQ.Iso .OR.   &
-                   Nnniso.NE.Numiso) THEN
-! ***          If we're keeping spin groups separate, and this is the wrong
-! ***             spin group, then don't do this one
-                  DO Mchan=1,spinMgr%getNumChannels()
-                     IF (Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
-                        Echan(Mchan,Mgr).EQ.C2)) THEN
-                        DO Mchanx=1,spinMgr%getNumEntryChannels()
-                           Br = Crssx(1,Mchanx,Mchan,Mgr)
-                           Bi = Crssx(2,Mchanx,Mchan,Mgr)
-                           Jxm = Jxmmm (Mchanx,Mchan,Mgr,Jxn, Ntotc, Lllmax)
-! ----------------------------------------------------------
-         DO Iipar=1,Ndasig
-            Dar = Derivx(1,Nchanx,Nchan,Iipar,Ngr)
-            Dai = Derivx(2,Nchanx,Nchan,Iipar,Ngr)
-            IF (Dar.NE.Zero .OR. Dai.NE.Zero) THEN
-               IF (Isopar(Iipar).EQ.0) Isopar(Iipar) = Iso
-               Dr = Br*Dar + Bi*Dai
-            ELSE
-               Dr = Zero
-            END IF
-            Dbr = Derivx(1,Mchanx,Mchan,Iipar,Mgr)
-            Dbi = Derivx(2,Mchanx,Mchan,Iipar,Mgr)
-            IF (Dbr.NE.Zero .OR. Dbi.NE.Zero) THEN
-               IF (Isopar(Iipar).EQ.0) Isopar(Iipar) = Iso
-               Dr = Ar*Dbr + Ai*Dbi + Dr
-            END IF
-            IF (Dr.NE.Zero) THEN
-               DO L=1,Lllmax
-                  Jx = Jxm + L
-                  CALL Find_Kountr_Jx (calc%Ixlmn(:,1), Kkxlmn, Jx,   &
-                      Kountr, Klmn)
-                  IF (Kountr.GT.0) THEN
-                     IF (calc%Xlmn(Kountr).NE.Zero) THEN
-                        Dddlll(L,Iipar) =   &
-                           Dddlll(L,Iipar) + Dr*calc%Xlmn(Kountr)
-                     END IF
-                  END IF
-               END DO
-            END IF
-         END DO
-! ----------------------------------------------------------
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-! ----------------------------------------------------------
-                           END IF
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-      END DO
-!
-! *** find derivative of Crss wrt isotopic Abundance
-! ##################### maybe NOT CORRECT YET FOR Iq_Val>0
-      IF (Nfpiso.GT.0) THEN
-         DO Iso=1,Numiso
-            call calc%resData%getIsoInfo(isoInfo, Iso)
-            Ifl = isoInfo%getFitOption()
-            IF (Ifl.GT.0) THEN
-               Ifl = Ifl
-               Isopar(Ifl) = Iso
-               DO L=1,Lllmax
-                  Dddlll(L,Ifl) = Ccclll(L,Iso)/   &
-                   calc%resData%getAbundanceByIsotope(Iso)
-               END DO
-            END IF
-         END DO
-      END IF
-!
-      IF (Ndasig.GT.0) THEN
-         DO Iipar=1,Ndasig
-            DO L=1,Lllmax
-               Dasigx(L,Iipar) = Dddlll(L,Iipar)/Eb
-            END DO
-         END DO
-      END IF
-      RETURN
-      END
+    !
+    RETURN
+  END subroutine Derleg
 
 end module mxct22_m
diff --git a/sammy/src/xct/mxct23.f90 b/sammy/src/xct/mxct23.f90
index 6dfca2191..c7c1480b5 100644
--- a/sammy/src/xct/mxct23.f90
+++ b/sammy/src/xct/mxct23.f90
@@ -1,48 +1,51 @@
+module mxct23_m
+use XctCrossCalc_M
+implicit none
+! Note: To do: don't use the global parameter Ksindi, Numdet or Nfissl
+contains
 !
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Dersel (Siabnd,Iflmsc,   &
-         Dasigs, Dbsigs, Crss, Deriv, Isopar,   &
-         Su, Eb)
+      SUBROUTINE Dersel (calc, Siabnd,Iflmsc)
 !
 ! *** purpose -- set derivatives of transmission sample total cross
 ! ***            section for self-indication experiments
 !
-      use fixedi_m
-      use ifwrit_m
-      use lbro_common_m
-      use constn_common_m
-      use EndfData_common_m
+      use ifwrit_m, only : Ksindi
+      use constn_common_m, only : Fourpi
       use SammySpinGroupInfo_M
       use SammyIsoInfo_M
-      use paramagnetic_cross_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
-      DIMENSION Siabnd(*),   &
-         Iflmsc(*),  Dasigs(*),   &
-         Dbsigs(Ndbxxx,*), Crss(Ncrsss,*), Deriv(Ncrsss,Nnpar,*),   &
-         Isopar(*)
+      type(XctCrossCalc)::calc
+      real(kind=8):: Siabnd(*)
+      integer:: Iflmsc(*)
       type(SammySpinGroupInfo)::spinInfo
       type(SammyIsoInfo)::isoInfo
-      DATA Zero /0.0d0/
+      real(kind=8)::val
+      real(kind=8),parameter::Zero=0.0d0
+      integer::Iipar, Iipars, Ik, Iso, IsoN, Lk, N, isoOur
 !
-      IF (Numiso.NE.0) THEN
+      IF (calc%resData%getNumIso().ne.0) THEN
 !
 ! ***    beginning with self-indication transmission
          Ik = Ksindi - 1
-         DO Iso=1,Numiso
+         DO Iso=1,calc%numIso
             Ik = Ik + 1
             Iipars = Iflmsc(ik)
             IF (Iipars.GT.0) THEN
-               Ipars = Iipars - Ndasig
-               DO N=1,Ngroup
-                  call resParData%getSpinGroupInfo(spinInfo, N) 
+               DO N=1,calc%resData%getNumSpinGroups()
+                  call calc%resData%getSpinGroupInfo(spinInfo, N)
                   IF (spinInfo%getIncludeInCalc()) THEN
-                     isoN = spinInfo%getIsotopeIndex() 
+                     isoN = 1
+                     if (calc%separateIso) isoN = spinInfo%getIsotopeIndex()
                      IF (isoN.EQ.Iso) THEN
-                        Dbsigs(Ipars,Iso) = Dbsigs(Ipars,Iso) +   &
-                                            Crss(1,n) + Crss(2,n)
+                        val = calc%crossInternal(1, N, 0) + &
+                              calc%crossInternal(2, N, 0)
+                        val = val * Fourpi/calc%ener
+                        if (val.ne.0.0d0) then
+                           call calc%crossDataSelf%addDataNs(calc%row, 1, Iipars, iso, val)
+                        end if
 ! ***                   This is Derivative wrt Abundance
                      END IF
                   END IF
@@ -53,55 +56,33 @@
 !
 ! *** si2 now do derivatives wrt resonance parameters et al
       Ik = Ksindi - 1
-      DO Iso=1,Nnniso
+      DO Iso=1,calc%numIso
          Ik = Ik + 1
-         Iipars = Iflmsc(ik)
-         Ipars = 0
-         IF (Iipars.GT.0) Ipars = Iipars - Ndasig
-         call resParData%getIsoInfo(isoInfo, Iso)
+         Iipars = Iflmsc(ik)        
+         call calc%resData%getIsoInfo(isoInfo, Iso)
          Lk = isoInfo%getFitOption()
-         DO N=1,Ngroup
-            call resParData%getSpinGroupInfo(spinInfo, N)
+         DO N=1,calc%resData%getNumSpinGroups()
+            call calc%resData%getSpinGroupInfo(spinInfo, N)
             isoN = spinInfo%getIsotopeIndex()
-            IF (isoN.EQ.Iso .AND. Ndasig.GT.0) THEN
-               DO Iipar=1,Ndasig
-                  IF (Lk.LE.0 .OR. Lk.NE.Iipar) THEN
+            IF (isoN.EQ.Iso) THEN
+               DO Iipar=1,calc%covariance%getNumTotalParam()
+                  IF (Lk.NE.Iipar) THEN   ! if abundance is not varied (lk <= 0), it can't be equal to Iipar
 ! ***                If this parameter is an abundance for the capture
 ! ***                     sample, then derivatives here are zero
-                     Dasigs(Iipar) = Dasigs(Iipar) +   &
-                       Siabnd(n) * ( Deriv(1,Iipar,N)+Deriv(2,Iipar,N) )
-                  END IF
-               END DO
-            END IF
-            IF (Ndbsig.GT.0) THEN
-               DO Iipar=1,Ndbsig
-                  IF (Ipars.NE.Iipar) THEN
-! ***             IF (this is self-indication Abndnc) it's already done
-                     IF (Lk.LE.0 .OR. Lk.NE.Iipar) THEN
-! ***                If this parameter is an abundance for the capture
-! ***                     sample, then derivatives here are zero
-                        Dbsigs(Iipar,Iso) = Dbsigs(Iipar,Iso) +   &
-                           Siabnd(N) * ( Deriv(1,Iipar+Ndasig,N) +   &
-                                         Deriv(2,Iipar+Ndasig,N) )
-                     END IF
+                     val = calc%crossInternal(1, N, Iipar) + &
+                           calc%crossInternal(2, N, Iipar)
+                     val = Siabnd(n) * val
+                     if (calc%crossSelfWhy(Iipar)) then
+                        ! reproduce a SAMMY bug for self-indication experiments. To Do fix the bug insteadq
+                        val = val * Fourpi/calc%ener
+                     end if
+                     if (val.ne.0.0d0) then
+                        call calc%crossDataSelf%addDataNs(calc%row, 1, Iipar, iso, val)
+                     end if
                   END IF
                END DO
             END IF
          END DO
-         IF (Ndasig.GT.0) THEN
-            DO Iipar=1,Ndasig
-               IF (Isopar(Iipar).EQ.Iso) THEN
-                  IF (Dasigs(Iipar).NE.Zero) Dasigs(Iipar) =   &
-                                             Dasigs(Iipar)*Fourpi/Eb
-               END IF
-            END DO
-         END IF
-         IF (Ndbsig.GT.0) THEN
-            DO Iipar=1,Ndbsig
-               IF (Dbsigs(Iipar,Iso).NE.Zero) Dbsigs(Iipar,Iso) =   &
-                   Dbsigs(Iipar,Iso)*Fourpi/Eb
-            END DO
-         END IF
       END DO
 !
       RETURN
@@ -110,63 +91,54 @@
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Deroth ( Pardet, Ifldet,   &
-         Igrdet, Iflmsc, Dasigx, Dbsigx, Crss,   &
-         Deriv, Isopar, Termf, Termfx, Su, Eb)
+      SUBROUTINE Deroth ( calc, Pardet, Ifldet,  Igrdet, Iflmsc)
 !
 ! *** Purpose -- Set derivatives of "other" cross sections
 !                           (non-angular-dependent)
 !
-      use fixedi_m
-      use ifwrit_m
-      use lbro_common_m
-      use constn_common_m
-      use EndfData_common_m
+      use fixedi_m, only : Numdet
+      use ifwrit_m, only : Ksindi, Nfissl
+      use constn_common_m, only : Fourpi
       use SammySpinGroupInfo_M
-      use paramagnetic_cross_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
-      DIMENSION Iflmsc(*), Pardet(*), Ifldet(*),   &
-         Igrdet(*), Dasigx(Nnnsig,*), Dbsigx(Nnnsig,Nnpar,*),   &
-         Crss(Ncrsss,*), Deriv(Ncrsss,Nnpar,*), Isopar(*), Termf(*),   &
-         Termfx(*)
+      type(XctCrossCalc)::calc
+      real(kind=8):: Pardet(*)
+      integer:: Iflmsc(*), Ifldet(*), Igrdet(*)
       type(SammySpinGroupInfo)::spinInfo
-      DATA Zero /0.0d0/
-!
-!
-      Nnnnis = Numiso
-      IF (Nnnnis.EQ.0) Nnnnis = 1
-      Nnn = Lllmax + 1
-      DO 90 Iso=1,Nnniso
-         Ix = 0
-         DO 80 Iipar=1,Nnpar
-!
-            IF (Ksindi.GT.0 .AND. Kcros.EQ.8) THEN
+      real(kind=8)::Eb
+      real(kind=8)::Ab, Dterfx,  Dtermf, Total, cross
+      integer::I,Ifl, Igrd, Iipar, Iiparn, Iso, isoN, Isox
+      integer::Ix, Lk, Lkk, N, Nnn, Nnnnis, Nnnsig
+      real(kind=8),parameter::Zero=0.0d0
+!
+!
+      Nnnnis = calc%resData%getNumIso()
+      Nnn = calc%Lllmax + 1
+      Nnnsig = calc%crossData%getNnnsig()
+      Eb = calc%ener
+      DO Iso=1,calc%numIso
+         Ix = 0        
+         DO  Iipar=1,calc%covariance%getNumTotalParam()
+!
+            IF (Ksindi.GT.0 .AND. calc%reactType.EQ.8) THEN
                Lkk = Ksindi - 1
                DO Isox=1,Nnnnis
                   Lkk = Lkk + 1
                   Lk = Iflmsc(lkk)
-                  IF (Lk.GT.0 .AND. Lk.EQ.Iipar) GO TO 80
+                  IF (Lk.GT.0 .AND. Lk.EQ.Iipar) cycle
                END DO
             END IF
 !
-            Dtermn = Zero
-            Dterma = Zero
-            Dterax = Zero
+            calc%Termf = Zero
+            calc%Termfx = Zero
             Dtermf = Zero
-            Dterfx = Zero
-            IF (Ncrsss.GE.3) THEN
-               DO I=1,Ncrsss-2
-                  Termf(I) = Zero
-                  Termfx(I) = Zero
-               END DO
-            END IF
-            DO N=1,Ngroup
-               call resParData%getSpinGroupInfo(spinInfo, N) 
-               IF (spinInfo%getIncludeInCalc()) THEN                  
-                  isoN = spinInfo%getIsotopeIndex()
-                  IF (Numiso.LE.0 .OR. isoN.EQ.Iso .OR.   &
-                      Nnniso.NE.Numiso) THEN
+            Dterfx = Zero           
+            DO N=1,calc%resData%getNumSpinGroups()
+               call calc%resData%getSpinGroupInfo(spinInfo, N)
+               IF (spinInfo%getIncludeInCalc()) THEN
+                  isoN = 1
+                  if( calc%separateIso) isoN = spinInfo%getIsotopeIndex()
+                  IF (isoN.EQ.Iso) THEN
 ! ***                If we're keeping spin groups separate, and this is
 ! ***                   the wrong spin group, then don't do this one now
                      Ab = spinInfo%getAbundance()
@@ -174,138 +146,91 @@
                         Igrd = Igrdet(N)
                         Ifl = Ifldet(Igrd)
                         IF (Ifl.EQ.Iipar) THEN
-                           Dterax = Dterax + Crss(2,N)*ab
-                           IF (Ncrsss.GE.3) THEN
-                              DO I=1,Ncrsss-2
-                                 Termfx(I) = Termfx(I) + Crss(I+2,N)*Ab
-                              END DO
-                           END IF
+                           Do I = 2, calc%ntotc+1
+                              calc%termfx(I) = calc%Termfx(I) + &
+                                 calc%crossInternal(I, N, 0)*Ab
+                           end do
                         ELSE
-                           Dterax = Dterax +   &
-                                  Deriv(2,Iipar,N)*Ab*Pardet(Igrdet(N))
-                           IF (Ncrsss.GE.3) THEN
-                              DO I=1,Ncrsss-2
-                                 Termfx(I) = Termfx(I) + Ab *   &
-                                    Deriv(I+2,Iipar,N)*Pardet(Igrdet(N))
-                              END DO
-                           END IF
+                           Do I = 2, calc%ntotc+1
+                              calc%termfx(I) =  calc%termfx(I)  + &
+                                 calc%crossInternal(I, N, Iipar)*Ab*Pardet(Igrdet(N))
+                           end do
                         END IF
                      ELSE
-                        Dtermn = Deriv(1,Iipar,N)*Ab + Dtermn
-                        Dterma = Deriv(2,Iipar,N)*Ab + Dterma
-                        IF (Ncrsss.GE.3) THEN
-                           DO I=1,Ncrsss-2
-                              Termf(I) = Termf(I) +Deriv(I+2,Iipar,N)*Ab
-                           END DO
-                        END IF
+                        do I = 1, calc%ntotc+1
+                           calc%termf(I) = calc%termf(I) + &
+                               calc%crossInternal(I, N, Iipar)*Ab
+                        end do
                      END IF
                   END IF
                END IF
             END DO
-            IF (Ncrsss.GE.3) THEN
-               DO I=1,Ncrsss-2
-                  Dtermf = Dtermf + Termf(I)
-                  Dterfx = Dterfx + Termfx(I)
-               END DO
-            END IF
-!
-            IF (Dtermn.NE.Zero .OR. Dterma.NE.Zero .OR. Dterax.NE.Zero   &
-                .OR. Dtermf.NE.Zero .OR. Dterfx.NE.Zero) THEN
-               IF (Iipar.LE.Ndasig) THEN
-                  IF (Isopar(Iipar).EQ.0 .OR. Isopar(Iipar).EQ.Iso) THEN
-                     Isopar(Iipar) = Iso
-                  END IF
-               END IF
+            Do I = 3, calc%ntotc+1
+               Dtermf = Dtermf + calc%termf(I)
+               Dterfx = Dterfx + calc%Termfx(I)
+            end do
+
+!
+            IF (calc%termf(1).NE.Zero .OR. calc%termf(2).NE.Zero .OR. calc%termfx(2).NE.Zero   &
+                .OR. Dtermf.NE.Zero .OR. Dterfx.NE.Zero) THEN                           
+                calc%crossSelfWhy(Iipar) = .true.
             ELSE
-               GO TO 80
+               cycle
             END IF
 !
 !
-            Iiparn = Iipar - Ndasig
 ! ***       total cross section
             IF (Nnn.GT.0) THEN
-               IF (Iipar.LE.Ndasig) THEN
-                  IF (Isopar(Iipar).EQ.Iso) THEN
-                     Dasigx(Nnn,Iipar) = (Dtermn+Dterma)*Fourpi/Eb
-                  END IF
-               ELSE
-                  Dbsigx(Nnn,Iiparn,Iso) = (Dtermn+Dterma)*Fourpi/Eb
-               END IF               
+               Total = (calc%termf(1)+calc%termf(2))*Fourpi/Eb
+               cross = total
                Ix = Ix + 1
             END IF
 !
 ! ***       elastic scattering cross section
-            IF (Kcros.EQ.2) THEN
-               IF (Iipar.LE.Ndasig) THEN
-                  IF (Isopar(Iipar).EQ.Iso)   &
-                     Dasigx(Nnnsig,Iipar) = Dtermn*Fourpi/Eb
-               ELSE
-                  Dbsigx(Nnnsig,Iiparn,Iso) = Dtermn*Fourpi/Eb
-               END IF
+            IF (calc%reactType.EQ.2) THEN
+               cross = calc%termf(1) *Fourpi/Eb
             END IF
 !
 ! ***       inelastic scattering cross section, or fission
-            IF (Kcros.EQ.3) THEN
-               IF (Iipar.LE.Ndasig) THEN
-                  IF (Isopar(Iipar).EQ.Iso) THEN
-                     IF (Numdet.EQ.0) THEN
-                        Dasigx(Nnnsig,Iipar) = Dtermf*Fourpi/Eb
-                     ELSE
-                        Dasigx(Nnnsig,Iipar) = Dterfx*Fourpi/Eb
-                     END IF
-                  END IF
+            IF (calc%reactType.EQ.3) THEN
+               IF (Numdet.EQ.0) THEN
+                  cross = Dtermf*Fourpi/Eb
                ELSE
-                  IF (Numdet.EQ.0) THEN
-                     Dbsigx(Nnnsig,Iiparn,Iso) = Dtermf*Fourpi/Eb
-                  ELSE
-                     Dbsigx(Nnnsig,Iiparn,Iso) = Dterfx*Fourpi/Eb
-                  END IF
-               END IF
+                  cross = Dterfx*Fourpi/Eb
+               END IF               
             END IF
 !
 ! ***       capture cross section
-            IF (Kcros.EQ.4 .OR. Kcros.EQ.8) THEN
-               IF (Iipar.LE.Ndasig) THEN
-                  IF (Isopar(Iipar).EQ.Iso) THEN
-                     IF (Numdet.EQ.0) THEN
-                        Dasigx(Nnnsig,Iipar) = (Dterma-Dtermf)*Fourpi/Eb
-                     ELSE
-                        Dasigx(Nnnsig,Iipar) = (Dterax-Dterfx)*Fourpi/Eb
-                     END IF
-                  END IF
+            IF (calc%reactType.EQ.4 .OR. calc%reactType.EQ.8) THEN
+               IF (Numdet.EQ.0) THEN
+                  cross = (calc%termf(2)-Dtermf)*Fourpi/Eb
                ELSE
-                  IF (Numdet.EQ.0) THEN
-                     Dbsigx(Nnnsig,Iiparn,Iso)=(Dterma-Dtermf)*Fourpi/Eb
-                  ELSE
-                     Dbsigx(Nnnsig,Iiparn,Iso)=(Dterax-Dterfx)*Fourpi/Eb
-                  END IF
-               END IF
+                  cross = (calc%termfx(2)-Dterfx)*Fourpi/Eb
+               END IF              
             END IF
 !
 ! ***       fission cross section for integral quantities
-            IF (Kcros.EQ.10 .AND. Nfissl.EQ.1) THEN
-               IF (Iipar.LE.Ndasig) THEN
-                  IF (Isopar(Iipar).EQ.Iso) THEN
-                     Dasigx(Nnn,Iipar) = Dtermf*Fourpi/Eb
-                  END IF
-               ELSE
-                  Dbsigx(Nnn,Iiparn,Iso) = Dtermf*Fourpi/Eb
-               END IF
+            IF (calc%reactType.EQ.10 .AND. Nfissl.EQ.1) THEN
+               Total = Dtermf*Fourpi/Eb
             END IF
 !
 ! ***       absorption cross section, maybe for integral quantities
-            IF (Kcros.EQ.5 .OR. (Kcros.EQ.10 .AND. Nfissl.EQ.1) ) THEN
-               IF (Iipar.LE.Ndasig) THEN
-                  IF (Isopar(Iipar).EQ.Iso) THEN
-                     Dasigx(Nnnsig,Iipar) = Dterma*Fourpi/Eb
-                  END IF
-               ELSE
-                  Dbsigx(Nnnsig,Iiparn,Iso) = Dterma*Fourpi/Eb
-               END IF
+            IF (calc%reactType.EQ.5 .OR. calc%reactType.EQ.10 ) THEN
+               cross = calc%termf(2)*Fourpi/Eb
             END IF
-!
-   80    CONTINUE
-   90 CONTINUE
+
+            if (Nnn.ne.Nnnsig) then
+               if (total.ne.0.0d0) then
+                  call  calc%crossData%addDataNs(calc%row, Nnn, Iipar, Iso, total)
+               end if
+            end if
+            if (cross.ne.0.0d0) then
+              call  calc%crossData%addDataNs(calc%row, Nnnsig, Iipar, Iso, cross)
+            end if
+!
+        end do  ! end of loop over Iipar
+      end do  ! end of loop over isotopes
 !
       RETURN
       END
+end module mxct23_m
diff --git a/sammy/src/xct/mxct24.f90 b/sammy/src/xct/mxct24.f90
index 98fae5bbd..b6961a40c 100644
--- a/sammy/src/xct/mxct24.f90
+++ b/sammy/src/xct/mxct24.f90
@@ -9,10 +9,6 @@ contains
       real(kind=8) function Addpmc (Parpmc, Isopmc, Numpmc,  Isox, Ab,  Eb) result(Answer)
 !
 ! *** purpose -- Add paramgnetic cross section thereof
-!
-      !use fixedi_m, only  : Nnniso, Numiso, Numpmc
-      !use EndfData_common_m, only : resParData
-
 !
       real(kind=8)::Parpmc(:,:)
       integer::Isopmc(:)
diff --git a/sammy/src/xct/mxct26.f90 b/sammy/src/xct/mxct26.f90
index 55ce15f84..1dfc4e858 100644
--- a/sammy/src/xct/mxct26.f90
+++ b/sammy/src/xct/mxct26.f90
@@ -1,13 +1,14 @@
 module mxct26_m
+IMPLICIT None
 contains
+! Todo: remove dependence on global parameters
 !
 !
 ! --------------------------------------------------------------
 !
-      Subroutine Find_If_Coulomb (calc, IfCoul, Ifdif)
+      Subroutine Find_If_Coulomb (calc, IfCoul)
       use CrossSectionCalculator_M
       use SammySpinGroupInfo_M
-      IMPLICIT none
       class(CrossSectionCalculator)::calc
       type(SammySpinGroupInfo)::spinInfo
 
@@ -17,7 +18,7 @@ contains
 ! *** On output, IfCoul = Maximum number of entrance channels which
 ! ***    require Coulomb
        IfCoul = 0
-      IF (Ifdif.EQ.1) THEN
+      IF (calc%needAngular .and. calc%reactType.ne.11) THEN  ! angular for elastic
          Nn = 0
          hasCoulomb = .false.
          DO I=1,calc%resData%getNumSpinGroups()
@@ -34,24 +35,23 @@ contains
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Start_Coul (Zke, Ccoulx)
-      use fixedi_m, only  : Ntotc
-      use  EndfData_common_m
+      SUBROUTINE Start_Coul (Zke, Ccoulx, resData)
+      use SammyRMatrixParameters_M
       use SammySpinGroupInfo_M
-      IMPLICIT None
-      real(kind=8)::Zke(Ntotc,*), Ccoulx(Ntotc,*)
+      real(kind=8)::Zke(:,:), Ccoulx(:,:)
+      type(SammyRMatrixParameters)::resData
       type(SammySpinGroupInfo)::spinInfo
       real(kind=8)::A
-      integer::Igroup, Ich, Nenti, Ntoti
+      integer::Igroup, Ich, Nenti
       real(kind=8),parameter::Hth=0.01d0
 
-      DO Igroup=1,resParData%getNumSpinGroups()
-         call resParData%getSpinGroupInfo(spinInfo, Igroup)
+      Ccoulx = 0.0d0
+      DO Igroup=1,resData%getNumSpinGroups()
+         call resData%getSpinGroupInfo(spinInfo, Igroup)
          A = Hth*   &
              spinInfo%getAbundance()*   &
              spinInfo%getGFactor()
-         Nenti = spinInfo%getNumEntryChannels()
-         Ntoti = spinInfo%getNumChannels()
+         Nenti = spinInfo%getNumEntryChannels()     
          DO Ich=1,Nenti
             Ccoulx(Ich,Igroup) = A/Zke(Ich,Igroup)**2
          END DO
@@ -62,26 +62,26 @@ contains
 !
 ! ______________________________________________________________________
 !
-      SUBROUTINE Store_Coul (Ccoul, Dcoul, Crssx, Derivx, Ccoulx, Jdat)
+      SUBROUTINE Store_Coul (Ccoul, Dcoul, angInternal, Ccoulx, Jdat)
       use fixedi_m, only : Ntotc, Ngroup
       use ifwrit_m, only : Nnpar
-      use  EndfData_common_m
-      IMPLICIT NONE
+      use  EndfData_common_m     
+      real(kind=8),dimension(:,:,:,:,0:)::angInternal
       integer::Jdat
-      real(kind=8)::Ccoul(2,Ntotc,Ngroup,*), Crssx(2,Ntotc,Ntotc,*),   &
-             Dcoul(2,Ntotc,Nnpar,Ngroup,*),   &
-             Derivx(2,Ntotc,Ntotc,Nnpar,*), Ccoulx(Ntotc,*)
+      real(kind=8)::Ccoul(2,Ntotc,Ngroup,*),   &
+             Dcoul(2,Ntotc,Nnpar,Ngroup,*)
+      real(kind=8)::Ccoulx(:,:)
       integer::igroup, Nn, Ix, Iipar
 
       DO Igroup=1,resParData%getNumSpinGroups()
          DO Nn=1,Ntotc
             DO Ix=1,2
                Ccoul(Ix,Nn,Igroup,Jdat) =    &
-                  Crssx(Ix,Nn,Nn,Igroup)*Ccoulx(Nn,Igroup)
+                    angInternal(Ix,Nn,Nn,Igroup, 0)*Ccoulx(Nn,Igroup)
                IF (Nnpar.GT.0) THEN
                   DO Iipar=1,Nnpar
                      Dcoul(Ix,Nn,Iipar,Igroup,Jdat) =   &
-                        Derivx(Ix,Nn,Nn,Iipar,Igroup)*Ccoulx(Nn,Igroup)
+                        angInternal(Ix,Nn,Nn,Igroup, Iipar)*Ccoulx(Nn,Igroup)
                   END DO
                END IF
             END DO
@@ -94,7 +94,6 @@ contains
 ! --------------------------------------------------------------
 !
       SUBROUTINE Get_Coul_Phase (Cr, Ci, Lspin, Echan, Zeta, Su)
-      IMPLICIT NONE
       real(kind=8)::Aa, Cr, Ci, Cc, Ccx, Ccy, Eta,Echan, Zeta, Su
       integer::L, Ll, Lspin
       real(kind=8)::Ss, Ssx, Ssy
diff --git a/sammy/src/xct/mxct27.f90 b/sammy/src/xct/mxct27.f90
index e9104c4b3..c23f9643d 100644
--- a/sammy/src/xct/mxct27.f90
+++ b/sammy/src/xct/mxct27.f90
@@ -3,8 +3,9 @@
 ! --------------------------------------------------------------
 !
       SUBROUTINE Zero_Array (A, N)
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION A(*)
+      IMPLICIT None
+      real(kind=8)::A(*)
+      integer::K,N
       DO K=1,N
          A(K) = 0.0d0
       END DO
@@ -15,7 +16,9 @@
 ! --------------------------------------------------------------
 !
       SUBROUTINE Zero_Integer (Ia, N)
-      DIMENSION Ia(*)
+      implicit none
+      integer::Ia(*)
+      integer::K,N
       DO K=1,N
          Ia(K) = 0
       END DO
@@ -25,6 +28,7 @@
 
 
 module mxct27_m
+  IMPLICIT NONE
   contains
 !
 !
@@ -32,15 +36,18 @@ module mxct27_m
 !
       SUBROUTINE Write_Cross_Sections (derivs, &
                       Nnnsss, Kkkkkk, Kkkmin, If_W_Selfin, derivsSelf)
-      use fixedi_m
-      use ifwrit_m
-      use cbro_common_m
+      use fixedi_m, only : Montec, Ndasig, Ndbsig, Nnniso, numcro
+      use ifwrit_m, only : Kksave, Kmsave, ktzero
+      use cbro_common_m, only : Filein, Filout
       use SammyGridAccess_M
-      use EndfData_common_m
+      use EndfData_common_m, only : expData
       use DerivativeHandler_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+
       type(SammyGridAccess)::grid
       type(DerivativeHandler)::derivs, derivsSelf
+      integer::Nnnsss, Kkkkkk, Kkkmin, If_W_Selfin
+
+      integer::iipar, Iso, Iunit, J, K, Kk
 !
       optional derivsSelf
       IF (Montec.EQ.1) THEN
diff --git a/sammy/src/xct/mxct28.f90 b/sammy/src/xct/mxct28.f90
index 6f8746ad1..09ad058c4 100755
--- a/sammy/src/xct/mxct28.f90
+++ b/sammy/src/xct/mxct28.f90
@@ -1,39 +1,22 @@
+module Zgauss_m
+implicit none
+contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Zgauss (A, Gb, Eb)
-!
-! *** PURPOSE -- FORM THE CROSS SECTION Crss for the case where
-! ***            Gaussian (dummy) resonances are to be used
-! ***            AND THE ( PARTIAL DERIVATIVES OF THE CROSS SECTION
-! ***            WITH RESPECT TO THE VARIED PARAMETERS ) = Deriv
-!
-      use fixedi_m
-      use ifwrit_m
-      use exploc_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION A(*), Gb(*)
-!
-      CALL Gausss (Gb, Eb)
-      RETURN
-      END
-!
-!
-! --------------------------------------------------------------
-!
-      SUBROUTINE Gausss (Gb, Eb)
-      use fixedi_m
-      use ifwrit_m
-      use exploc_common_m
-      use EndfData_common_m
+      SUBROUTINE Zgauss (resparData, Gb, Eb)
+      use SammyRMatrixParameters_M
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION  Gb(*)
+
+      real(kind=8)::Gb, Eb
+      type(SammyRMatrixParameters)::resParData
       type(SammyResonanceInfo)::resInfo
       type(RMatResonance)::resonance
-      DATA One /1.0d0/
-      CALL Zero_Array (Gb, Nsgbou)
+      real(kind=8),parameter:: One = 1.0d0
+      integer::I, N
+      real(kind=8)::Gamtot, Eee
+      Gb = 0.0d0
       DO I=1,resParData%getNumResonances()
          call resParData%getResonanceInfo(resInfo,  I)
          call  resParData%getResonance(resonance, resInfo)
@@ -43,9 +26,10 @@
                Gamtot = Gamtot + resonance%getWidth(N)
             END DO
             Eee = 1000.0d0*(Eb-resonance%getEres())/Gamtot
-            Gb(1) = Gb(1) + dEXP(-Eee**2)
+            Gb = Gb + dEXP(-Eee**2)
          END IF
       END DO
 !
       RETURN
       END
+end module Zgauss_m
diff --git a/sammy/src/xct/mxct31.f90 b/sammy/src/xct/mxct31.f90
index 3e4c4c37d..0c70d0dbc 100644
--- a/sammy/src/xct/mxct31.f90
+++ b/sammy/src/xct/mxct31.f90
@@ -2,6 +2,9 @@ module mxct31_m
 use XctCrossCalc_M
 implicit none
 public Setleg_Slow, Find_Kountr_Jx_Slow
+
+! Todo: Delete dependence on Iq_val, number of distinct Q values
+
 contains
 
 integer function Jxlmn(Mb,Ma,M, Ntotc)
@@ -13,41 +16,30 @@ end function
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Setleg_Slow (calc, Sigxxx,   &
-         Ccclll, Crssx, Echan, Cmlab, Iso_Qv, Lllmmm, Eb)
+      SUBROUTINE Setleg_Slow (calc, Cmlab, Iso_Qv)
 !
-! *** Purpose -- set Ccclll(L,Iso) = coefficient of Legendre polynomial
+! *** Purpose -- set coefficient of Legendre polynomial
 ! ***                         P-sub-(L-1) for Isotope Iso
 !
-      !use fixedi_m
-      !use ifwrit_m
-      !use lbro_common_m
-      !use EndfData_common_m
-      use fixedi_m, only : Nnnsig, Kkxlmn, Ntotc, Iq_Iso, Iq_Val, Lllmax, &
-                                 Nnniso, Numiso
+      use fixedi_m, only : Iq_Val
       use SammySpinGroupInfo_M
       use mdat9_m
 
 !
       class(XctCrossCalc)::calc
-      integer::Lllmmm
-      real(kind=8)::Eb
-      real(kind=8)::    &
-         Sigxxx(Nnnsig,*), Ccclll(Lllmmm,*),   &
-         Crssx(2,Ntotc,Ntotc,*), Echan(Ntotc,*), Cmlab(3,*)
-      integer::  Iso_Qv(*)
+      real(kind=8),allocatable::  Cmlab(:,:)
+      integer,allocatable::  Iso_Qv(:)
       type(SammySpinGroupInfo)::spinMgr, spinNgr
       real(kind=8),parameter:: Zero = 0.0d0
-      real(kind=8)::Ai, Ar, Br, C2
+      real(kind=8)::Ai, Ar, Br, C2, val
       integer::Iq, Iso, isoMgr, isoNgr, Jxm, Jxn
       integer::Klmn, Kountr, L, Mchan, Mchanx, Mgr, Ngr
       integer::Nchan, Nchanx
 !
 !
-      CALL Zero_Array (Ccclll, Iq_Iso*Lllmax)
-      CALL Findpr (Kkxlmn, Klmn)
+      CALL Findpr (calc%C_G_Kxlmn, Klmn)
 !
-      DO Iq=1,Iq_Iso
+      DO Iq=1,calc%numiso
          IF (Iq_Val.NE.0) THEN
             Iso = Iso_Qv(Iq)
             C2 = Cmlab(2,Iq)
@@ -57,72 +49,64 @@ end function
          END IF
          DO Ngr=1,calc%resData%getNumSpinGroups()
             call calc%resData%getSpinGroupInfo(spinNgr, Ngr)
-            IF (spinNgr%getIncludeInCalc()) THEN
-               isoNgr = spinNgr%getIsotopeIndex()
-               IF (IsoNgr.EQ.Iso .OR. Nnniso.NE.Numiso) THEN
-! ***             If we're keeping isotopes separate, and this is the
-! ***                wrong isotope, then don't do this one now
-                  DO Nchan=1,spinNgr%getNumChannels()
-                     IF ((Iq_Val.NE.0 .AND. Echan(Nchan,Ngr).EQ.C2) .OR.   &
-                        Iq_Val.EQ.0) THEN
-                        DO Nchanx=1,spinNgr%getNumEntryChannels()
-                           Ar = Crssx(1,Nchanx,Nchan,Ngr)
-                           Ai = Crssx(2,Nchanx,Nchan,Ngr)
-! ***                      Ar & Ai are zero when Nchan is not an
-! ***                         included channel for the particular
-! ***                         reaction under consideration
-                           IF (Ar.NE.Zero .OR. Ai.NE.Zero) THEN
-! --------------------------------------------------------------------
-         Jxn = Jxlmn (Nchanx,Nchan,Ngr, Ntotc)
-         DO Mgr=1,calc%resData%getNumSpinGroups()
-            call calc%resData%getSpinGroupInfo(spinMgr, Mgr)
-            IF (spinMgr%getIncludeInCalc()) THEN               
-               isoMgr = spinMgr%getIsotopeIndex()
-               IF (IsoMgr.EQ.Iso .OR. Nnniso.NE.Numiso) THEN
-! ***             If we're keeping isotopes separate, and this
-! ***                is the wrong isotope, then don't do this one
-                  DO Mchan=1,spinMgr%getNumChannels()
-                     IF (Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
-                        Echan(Mchan,Mgr).EQ.C2)) THEN
+            IF (.not.spinNgr%getIncludeInCalc()) cycle
+            isoNgr = 1
+            if (calc%separateIso) isoNgr = spinNgr%getIsotopeIndex()
+            IF (IsoNgr.ne.Iso) cycle
+            ! ***             If we're keeping isotopes separate, and this is the
+            ! ***                wrong isotope, then don't do this one now
+            DO Nchan=1,spinNgr%getNumChannels()
+               IF (.not.((Iq_Val.NE.0 .AND. calc%Echan(Nchan,Ngr).EQ.C2) .OR.   &
+                    Iq_Val.EQ.0)) cycle
+               DO Nchanx=1,spinNgr%getNumEntryChannels()
+                  Ar = calc%angInternal(1,Nchanx,Nchan,Ngr,0)
+                  Ai = calc%angInternal(2,Nchanx,Nchan,Ngr,0)
+                  ! ***                      Ar & Ai are zero when Nchan is not an
+                  ! ***                         included channel for the particular
+                  ! ***                         reaction under consideration
+                  IF (Ar.eq.Zero .and. Ai.eq.Zero) cycle
+                  ! --------------------------------------------------------------------
+                  Jxn = Jxlmn (Nchanx,Nchan,Ngr, calc%Ntotc)
+                  DO Mgr=1,calc%resData%getNumSpinGroups()
+                     call calc%resData%getSpinGroupInfo(spinMgr, Mgr)
+                     IF (.not.spinMgr%getIncludeInCalc()) cycle
+                     isoMgr = 1
+                     if (calc%separateIso) isoMgr = spinMgr%getIsotopeIndex()
+                     IF (IsoMgr.ne.Iso) cycle
+                     ! ***             If we're keeping isotopes separate, and this
+                     ! ***                is the wrong isotope, then don't do this one
+                     DO Mchan=1,spinMgr%getNumChannels()
+                        IF (.not.(Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
+                             calc%Echan(Mchan,Mgr).EQ.C2))) cycle
                         DO Mchanx=1,spinMgr%getNumEntryChannels()
-                           Br = Ar*Crssx(1,Mchanx,Mchan,Mgr) +   &
-                                Ai*Crssx(2,Mchanx,Mchan,Mgr)
-                           IF (Br.NE.Zero) THEN
-                              Jxm = Jxlmn (Mchanx,Mchan,Mgr, Ntotc)
-                              DO L=1,Lllmax
-                                 CALL Find_Kountr_Jx_Slow (calc%Ixlmn,   &
-                                    Kkxlmn, L, Jxm, Jxn, Kountr, Klmn)
-                                 IF (Kountr.GT.0) THEN
-                                    IF (calc%Xlmn(Kountr).NE.Zero)   &
-                                       Ccclll(L,Iq) = Ccclll(L,Iq) +   &
-                                       Br*calc%Xlmn(Kountr)
-                                 END IF
-                              END DO
-                           END IF
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-! --------------------------------------------------------------------
-                           END IF
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-      END DO
-!
-! *** note that Xlmn includes Abundance; ergo so do Ccclll etc
-      DO Iso=1,Iq_Iso
-         DO L=1,Lllmmm
-            Sigxxx(L,Iso) = Ccclll(L,Iso)/Eb
-         END DO
-      END DO
+                           Br = Ar*calc%angInternal(1,Mchanx,Mchan,Mgr,0) +   &
+                                Ai*calc%angInternal(2,Mchanx,Mchan,Mgr,0)
+                           IF (Br.eq.Zero) cycle
+                           Jxm = Jxlmn (Mchanx,Mchan,Mgr, calc%Ntotc)
+                           DO L=1,calc%Lllmax
+                              CALL Find_Kountr_Jx_Slow (calc%Ixlmn,   &
+                                   calc%C_G_Kxlmn, L, Jxm, Jxn, Kountr, Klmn)
+                              IF (Kountr.GT.0) THEN
+                                 IF (calc%Xlmn(Kountr).NE.Zero)   then
+                                    val = Br*calc%Xlmn(Kountr)
+                                    ! note that Xlmn includes Abndnc; ergo so do calc%crossData% etc
+                                    ! not corrected for 1/energy yet
+                                    if (val.ne.0.0d0) then
+                                       call calc%crossData%addDataNs(calc%row, L, 0, Iq, val)
+                                    end if
+                                 end if
+                              end if
+                           END DO ! loop over legender order
+                        END DO  ! inner loop over entry channels (Mgr)
+                     END DO ! inner loop over channels (Mgr)
+                  END DO  ! inner loop over spin groups (Mgr)
+               END DO ! end loop over entry channels (Ngr)
+            END DO ! end loop over channels (Ngr)
+         END DO ! end loop over spin groups (Ngr)
+      END DO ! end loop over calc%numIso
+
       RETURN
-      END
+      END subroutine
 !
 !
 ! --------------------------------------------------------------
diff --git a/sammy/src/xct/mxct32.f90 b/sammy/src/xct/mxct32.f90
index 7b242eb72..0f23b213e 100644
--- a/sammy/src/xct/mxct32.f90
+++ b/sammy/src/xct/mxct32.f90
@@ -1,169 +1,156 @@
 module mxct32_m
-use XctCrossCalc_M
-IMPLICIT none
+  use XctCrossCalc_M
+  IMPLICIT none
 
-public Derleg_Slow
+  public Derleg_Slow
 
+  ! Todo: Delete dependence on Iq_val, number of distinct Q values
 contains
 
-integer function Jxlmn(Mb,Ma,M, Ntotc)
-   integer::Mb,Ma,M, Ntotc
-   Jxlmn = ((M-1)*Ntotc+Ma-1)*Ntotc + Mb
-end function
-!
-!
-! ______________________________________________________________________
-!
-      SUBROUTINE Derleg_Slow ( calc,    &
-         Sigxxx, Dasigx, Ccclll, Dddlll,  Crssx,   &
-         Derivx, Isopar, Echan, Cmlab, Iso_Qv, Lllmmm, Eb)
-!
-! *** Purpose -- Set Dddlll(L,.,Iso) = Derivative of coefficient of
-! ***                  Legendre polynomial P-sub-(L-1) for Isotope Iso
-! ***
-! *** Note    -- Enter this routine only if Ndasig > 0 and Kslow=1
-!
-      use fixedi_m, only : Nnnsig, Iq_Iso, Iq_val, &
-                           Lllmax, Ndasig, Nfpiso, Nnniso, Numiso, Ntotc, &
-                           Kkxlmn
-      use ifwrit_m, only : Nnpar
-      use SammySpinGroupInfo_M
-      use SammyIsoInfo_M
-      use mdat9_m
-      use  mxct31_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-!
-      class(XctCrossCalc)::calc
-      real(kind=8)::Eb
-      integer::Lllmmm
-      real(kind=8)::    &
-         Sigxxx(Nnnsig,*),   &
-         Dasigx(Nnnsig,*), Ccclll(Lllmmm,*), Dddlll(Lllmmm,*),   &
-         Crssx(2,Ntotc,Ntotc,*),   &
-         Derivx(2,Ntotc,Ntotc,Nnpar,*),     &
-         Echan(Ntotc,*), Cmlab(3,*)
-      integer::  Isopar(*), Iso_Qv(*)
-      type(SammySpinGroupInfo)::spinNgr, spinMgr
-      type(SammyIsoInfo)::isoInfo
-      real(kind=8),parameter :: Zero = 0.0d0
-      real(kind=8)::val
-      real(kind=8)::Ai, Ar, Bi, Br, C2, Dai, Dar, Dbi, Dbr, Dr
-      integer::Ifl, Iipar, Iq, Iso, isoMgr, isoNgr, Jxm, Jxn,  Klmn, Kountr
-       integer::L,Mchan, Mchanx, Mgr, Nchan, Nchanx, Ngr
-!
-      CALL Zero_Array (Dddlll, Lllmmm*Ndasig)
-      CALL Findpr (Kkxlmn, Klmn)
-!
-      DO Iq=1,Iq_Iso
-         IF (Iq_Val.NE.0) THEN
-            Iso = Iso_Qv(Iq)
-            C2 = Cmlab(2,Iq)
-         ELSE
-            Iso = Iq
-            C2 = Zero
-         END IF
-         DO Ngr=1,calc%resData%getNumSpinGroups()
-            call calc%resData%getSpinGroupInfo(spinNgr, Ngr)
-            IF (spinNgr%getIncludeInCalc()) THEN               
-               isoNgr = spinNgr%getIsotopeIndex()
-               IF (Numiso.LE.0 .OR. IsoNgr.EQ.Iso .OR.   &
-                  Nnniso.NE.Numiso) THEN
-! ***          If we're keeping spin groups separate, and this is the
-! ***             wrong spin group, then don't do this one now
-                  DO Nchan=1,spinNgr%getNumChannels()
-                     IF ((Iq_Val.NE.0 .AND. Echan(Nchan,Ngr).EQ.C2) .OR.   &
-                        Iq_Val.EQ.0) THEN
-                        DO Nchanx=1,spinNgr%getNumEntryChannels()
-                           Ar = Crssx(1,Nchanx,Nchan,Ngr)
-                           Ai = Crssx(2,Nchanx,Nchan,Ngr)
-                           IF (Ar.NE.Zero .OR. Ai.NE.Zero) THEN
-! ----------------------------------------------------------
-         Jxn = Jxlmn (Nchanx,Nchan,Ngr, Ntotc)
-         DO Mgr=1,calc%resData%getNumSpinGroups()
-            call calc%resData%getSpinGroupInfo(spinMgr, Mgr)
-            IF (spinMgr%getIncludeInCalc()) THEN
-               isoMgr = spinMgr%getIsotopeIndex() 
-               IF (Numiso.LE.0 .OR. IsoMgr.EQ.Iso .OR.   &
-                   Nnniso.NE.Numiso) THEN
-! ***          If we're keeping spin groups separate, and this is the wrong
-! ***             spin group, then don't do this one
-                  DO Mchan=1,spinMgr%getNumChannels()
-                     IF (Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
-                        Echan(Mchan,Mgr).EQ.C2)) THEN
-                        DO Mchanx=1,spinMgr%getNumEntryChannels()
-                           Br = Crssx(1,Mchanx,Mchan,Mgr)
-                           Bi = Crssx(2,Mchanx,Mchan,Mgr)
-                           Jxm = Jxlmn (Mchanx,Mchan,Mgr, Ntotc)
-! ----------------------------------------------------------
-         DO Iipar=1,Ndasig
-            Dar = Derivx(1,Nchanx,Nchan,Iipar,Ngr)
-            Dai = Derivx(2,Nchanx,Nchan,Iipar,Ngr)
-            IF (Dar.NE.Zero .OR. Dai.NE.Zero) THEN
-               IF (Isopar(Iipar).EQ.0) Isopar(Iipar) = Iso
-               Dr = Br*Dar + Bi*Dai
-            ELSE
-               Dr = Zero
-            END IF
-            Dbr = Derivx(1,Mchanx,Mchan,Iipar,Mgr)
-            Dbi = Derivx(2,Mchanx,Mchan,Iipar,Mgr)
-            IF (Dbr.NE.Zero .OR. Dbi.NE.Zero) THEN
-               IF (Isopar(Iipar).EQ.0) Isopar(Iipar) = Iso
-               Dr = Ar*Dbr + Ai*Dbi + Dr
-            END IF
-            IF (Dr.NE.Zero) THEN
-               DO L=1,Lllmax
-                  CALL Find_Kountr_Jx_Slow (calc%Ixlmn, Kkxlmn, L, Jxm, Jxn,   &
-                      Kountr, Klmn)
-                  IF (Kountr.GT.0) THEN
-                     IF (calc%Xlmn(Kountr).NE.Zero) THEN
-                        Dddlll(L,Iipar) =   &
-                           Dddlll(L,Iipar) + Dr*calc%Xlmn(Kountr)
-                     END IF
-                  END IF
-               END DO
-            END IF
-         END DO
-! ----------------------------------------------------------
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-! ----------------------------------------------------------
-                           END IF
-                        END DO
-                     END IF
-                  END DO
-               END IF
-            END IF
-         END DO
-      END DO
-!
-! *** find derivative of Crss wrt isotopic Abundance
-! ##################### maybe NOT CORRECT YET FOR Iq_Val>0
-      IF (Nfpiso.GT.0) THEN
-         DO Iso=1,Numiso
-            call calc%resData%getIsoInfo(isoInfo, Iso)
-            Ifl = isoInfo%getFitOption()
-            IF (Ifl.GT.0) THEN
-               Ifl = Ifl
-               Isopar(Ifl) = Iso
-               DO L=1,Lllmax
-                  Dddlll(L,Ifl) = Ccclll(L,Iso)/   &
-                calc%resData%getAbundanceByIsotope(Iso)
-               END DO
-            END IF
-         END DO
-      END IF
-!
-      IF (Ndasig.GT.0) THEN
-         DO Iipar=1,Ndasig
-            DO L=1,Lllmax
-               Dasigx(L,Iipar) = Dddlll(L,Iipar)/Eb
-            END DO
-         END DO
-      END IF
-      RETURN
-      END
+  integer function Jxlmn(Mb,Ma,M, Ntotc)
+    integer::Mb,Ma,M, Ntotc
+    Jxlmn = ((M-1)*Ntotc+Ma-1)*Ntotc + Mb
+  end function Jxlmn
+  !
+  ! Note :
+  ! Derleg and Derleg_slow are almost identical
+  ! except for the calls to Jxnnn, Jxmm and
+  ! Find_Kountr_Jx and Find_Kountr_Jx_Slow
+  ! all related to find data in  calc%Xlmn
+
+  !
+  ! ______________________________________________________________________
+  !
+  SUBROUTINE Derleg_Slow ( calc,  Cmlab, Iso_Qv)
+    !
+    ! *** Purpose -- Set Derivative of coefficient of
+    ! ***                  Legendre polynomial P-sub-(L-1) for Isotope Iso
+    ! ***
+    ! *** Note    -- Enter this routine only if we need derivatives and Kslow=1
+    !
+    use fixedi_m, only : Iq_val
+    use SammySpinGroupInfo_M
+    use SammyIsoInfo_M
+    use mdat9_m
+    use  mxct31_m
+    IMPLICIT DOUBLE PRECISION (a-h,o-z)
+    !
+    class(XctCrossCalc)::calc
+    real(kind=8)::Eb
+    integer::Lllmmm
+    real(kind=8),allocatable::Cmlab(:,:)
+    integer,allocatable::  Iso_Qv(:)
+    type(SammySpinGroupInfo)::spinNgr, spinMgr
+    type(SammyIsoInfo)::isoInfo
+    real(kind=8),parameter :: Zero = 0.0d0
+    real(kind=8)::val
+    real(kind=8)::Ai, Ar, Bi, Br, C2, Dai, Dar, Dbi, Dbr, Dr
+    integer::Ifl, Iipar, Iq, Iso, isoMgr, isoNgr, Jxm, Jxn,  Klmn, Kountr
+    integer::L,Mchan, Mchanx, Mgr, Nchan, Nchanx, Ngr
+    !
+    CALL Findpr (calc%C_G_Kxlmn, Klmn)
+    !
+    DO Iq=1,calc%numIso
+       IF (Iq_Val.NE.0) THEN
+          Iso = Iso_Qv(Iq)
+          C2 = Cmlab(2,Iq)
+       ELSE
+          Iso = Iq
+          C2 = Zero
+       END IF
+       DO Ngr=1,calc%resData%getNumSpinGroups()
+          call calc%resData%getSpinGroupInfo(spinNgr, Ngr)
+          IF (.not.spinNgr%getIncludeInCalc()) cycle
+          isoNgr  = 1
+          if (calc%separateIso) isoNgr = spinNgr%getIsotopeIndex()
+          IF (IsoNgr.ne.Iso) cycle
+          ! ***          If we're keeping spin groups separate, and this is the
+          ! ***             wrong spin group, then don't do this one now
+          DO Nchan=1,spinNgr%getNumChannels()
+             IF (.not.((Iq_Val.NE.0 .AND. calc%Echan(Nchan,Ngr).EQ.C2) .OR.   &
+                  Iq_Val.EQ.0)) cycle
+             DO Nchanx=1,spinNgr%getNumEntryChannels()
+                Ar = calc%angInternal(1,Nchanx,Nchan,Ngr, 0)
+                Ai = calc%angInternal(2,Nchanx,Nchan,Ngr, 0)
+                IF (Ar.eq.Zero .and. Ai.eq.Zero) cycle
+                ! ----------------------------------------------------------
+                Jxn = Jxlmn (Nchanx,Nchan,Ngr, calc%Ntotc)
+                DO Mgr=1,calc%resData%getNumSpinGroups()
+                   call calc%resData%getSpinGroupInfo(spinMgr, Mgr)
+                   IF (.not.spinMgr%getIncludeInCalc()) cycle
+                   isoMgr = 1
+                   if (calc%separateIso) isoMgr = spinMgr%getIsotopeIndex()
+                   IF (IsoMgr.ne.Iso) cycle
+                   ! ***          If we're keeping spin groups separate, and this is the wrong
+                   ! ***             spin group, then don't do this one
+                   DO Mchan=1,spinMgr%getNumChannels()
+                      IF (.not. (Iq_Val.EQ.0 .OR. (Iq_Val.NE.0 .AND.   &
+                           calc%Echan(Mchan,Mgr).EQ.C2))) cycle
+                      DO Mchanx=1,spinMgr%getNumEntryChannels()
+                         Br = calc%angInternal(1,Mchanx,Mchan,Mgr, 0)
+                         Bi = calc%angInternal(2,Mchanx,Mchan,Mgr, 0)
+                         Jxm = Jxlmn (Mchanx,Mchan,Mgr, calc%Ntotc)
+                         DO Iipar=1,calc%covariance%getNumTotalParam()
+                            Dar = calc%angInternal(1,Nchanx,Nchan,Ngr, Iipar)
+                            Dai = calc%angInternal(2,Nchanx,Nchan,Ngr, Iipar)
+                            IF (Dar.NE.Zero .OR. Dai.NE.Zero) THEN
+                               calc%crossSelfWhy(Iipar) = .true.
+                               Dr = Br*Dar + Bi*Dai
+                            ELSE
+                               Dr = Zero
+                            END IF
+                            Dbr = calc%angInternal(1,Mchanx,Mchan,Mgr, Iipar)
+                            Dbi = calc%angInternal(2,Mchanx,Mchan,Mgr, Iipar)
+                            IF (Dbr.NE.Zero .OR. Dbi.NE.Zero) THEN
+                               calc%crossSelfWhy(Iipar) = .true.
+                               Dr = Ar*Dbr + Ai*Dbi + Dr
+                            END IF
+                            IF (Dr.eq.Zero) cycle
+                            DO L=1,calc%Lllmax
+                               CALL Find_Kountr_Jx_Slow (calc%Ixlmn, calc%C_G_Kxlmn, L, Jxm, Jxn,   &
+                                    Kountr, Klmn)
+                               IF (Kountr.GT.0) THEN
+                                  IF (calc%Xlmn(Kountr).NE.Zero) THEN
+                                     val = Dr*calc%Xlmn(Kountr)
+                                     if (val.ne.0.0d0) then
+                                        call calc%crossData%setSharedValNs(calc%row, L, Iipar, val)
+                                     end if
+                                  END IF
+                               END IF
+                            END DO ! loop over legender order
+                         END DO ! loop over parameters
+                      END DO ! inner loop over entry channels (Mgr)
+                   END DO ! inner loop over channels (Mgr)
+                END DO  ! inner loop over spin groups (Mgr)
+             END DO ! end loop over entry channels (Ngr)
+          END DO ! end loop over channels (Ngr)
+       END DO ! end loop over spin groups (Ngr)
+    END DO  ! end loop over calc%numIso
+    !
+    ! *** find derivative of Crss wrt isotopic Abundance
+    ! ##################### maybe NOT CORRECT YET FOR Iq_Val>0
+    !
+    ! DAW todo: This still does not seem correct for
+    !           if  number of real isotopes > 1
+    DO Iq=1, calc%numIso
+       IF (Iq_Val.NE.0) THEN
+          Iso = Iso_Qv(Iq)
+       ELSE
+          Iso = Iq
+       END IF
+       call calc%resData%getIsoInfo(isoInfo, Iso)
+       Ifl = isoInfo%getFitOption()
+       IF (Ifl.GT.0) THEN
+          calc%crossSelfWhy(Ifl) = .true.
+          DO L=1,calc%Lllmax
+             val = calc%crossData%getDataNs(calc%row, L, 0, Iq)
+             if( val.eq.0.0d0) cycle
+             val = val/calc%resData%getAbundanceByIsotope(Iso)
+             call calc%crossData%setSharedValNs(calc%row, L, Ifl, val)
+          END DO
+       END IF
+    END DO
+    !
+    RETURN
+  END SUBROUTINE Derleg_Slow
 end module mxct32_m
-- 
GitLab