diff --git a/sammy/src/ang/mang1.f b/sammy/src/ang/mang1.f
index 22dc26622aefa89e49df18d05b778cefc29d4b31..b5e4ddb440d30d45845bc0414209acb238044000 100644
--- a/sammy/src/ang/mang1.f
+++ b/sammy/src/ang/mang1.f
@@ -27,6 +27,7 @@ C
       use SammyGridAccess_M
       use AuxGridHelper_M
       use array_sizes_common_m, only : calcData
+      use normalize_and_background
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
       LOGICAL Another_Process_Will_Happen, Need_Isotopes
 C
@@ -853,6 +854,7 @@ C
       use ifwrit_m
       use fixedr_m
       use lbro_common_m
+      use normalize_and_background
       use array_sizes_common_m, only : calcData
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 C
diff --git a/sammy/src/clm/mclm3.f b/sammy/src/clm/mclm3.f
index 560af711f5cc1406c2060edb2099c27ad5ce8590..7937275855c848cfa747c9d2e73c6685f0abc67f 100644
--- a/sammy/src/clm/mclm3.f
+++ b/sammy/src/clm/mclm3.f
@@ -33,6 +33,7 @@ C
       use mfgm3_M
       use Qtrap_Clm_m
       use array_sizes_common_m, only : calcData, calcDataSelf
+      use convert_to_transmission_m
       IMPLICIT None
       LOGICAL Need_Isotopes
       LOGICAL Another_Process_Will_Happen
diff --git a/sammy/src/clq/mclq1.f b/sammy/src/clq/mclq1.f
index 6a1124bfea4ee4795faa117c35bedf62d681cb8f..9421f5f7e237ae980c0c303f135e10f40d057af1 100644
--- a/sammy/src/clq/mclq1.f
+++ b/sammy/src/clq/mclq1.f
@@ -221,11 +221,6 @@ C ********* copy results if there is broadening
       END DO
 C *** end of do-loop on energies
 C
-      IF (Ywhich .OR. Maxwel.EQ.1 .OR. Knocor.EQ.1) THEN
-         Kkkmin = Kkkmin - 1
-         CALL Write_Cross_Sections (calcData,
-     *          Nnnsig, Kkkkkk, Kkkmin, 0)
-      END IF
 C
       call grid%destroy()
       call auxGrid%destroy()
diff --git a/sammy/src/cro/mcro1.f b/sammy/src/cro/mcro1.f
index 3758fd4c20efb919e56e5b7e068680725f1b51c6..2283ba4e26a452c4003f2d3386ed1065243813e5 100644
--- a/sammy/src/cro/mcro1.f
+++ b/sammy/src/cro/mcro1.f
@@ -107,8 +107,6 @@ C ********* if want Maxwellian averages or energy-averages with no
 C *********    correction terms, do same as if there is broadening
 C *********    except don't convert to transmission unless needed
             IF (Maxwel.EQ.1 .OR. Knocor.EQ.1) THEN
-               IF (Ytrans .AND. Kcros.LT.7 .AND. Ktruet.EQ.0) CALL
-     *            Transm (Sigxxx, Dasigx, Dbsigx, 1, Kvthck, Thick)
                GO TO 90
             END IF
 C
@@ -116,8 +114,6 @@ C ********* if there is doppler broadening, GO TO 90
             IF (Ydoppr) GO TO 90
 C
 C ********* if no Doppler, and this is transmission, make conversion
-            IF (Ytrans .AND. Kcros.LT.7 .AND. Ktruet.EQ.0) CALL
-     *         Transm (Sigxxx, Dasigx, Dbsigx, 1, Kvthck, Thick)
 C
 C ********* if there is resolution broadening or angular
 C                  distributions, do nothing else here
@@ -125,9 +121,6 @@ C                  distributions, do nothing else here
 C
 C ********* if ETA is being calculated and there is no broadening,
 C *********    find derivative with respect to nu
-            IF (Kcros.EQ.6) THEN
-               CALL Fix_Eta (Iflmsc, Sigxxx, Dasigx, Dbsigx)
-            END IF
 C
 C ********* If this is fake data, store it and move on
             IF (Kfake.EQ.1) THEN
@@ -136,13 +129,6 @@ C ********* If this is fake data, store it and move on
             END IF
 C
 C ********* if there is normalization or background, include it
-            IF (Ynrmbk) THEN
-               IF (Numnbk.GT.0) CALL Norm (Parnbk, Iflnbk, Sigxxx,
-     *            Dasigx, Dbsigx, Su, Nnnsig)
-               IF (Numbgf.GT.0) CALL Bgfrpi (Parbgf, Iflbgf, Kndbgf,
-     *            Bgfmin, Bgfmax, Texbgf, Teabgf, Sigxxx, Dbsigx, Su,
-     *            Nnnsig)
-            END IF
 C
 C ********* Write results onto theory if there is no broadening etc
             IF (Jjjdop.NE.1) THEN
@@ -152,12 +138,6 @@ C ********* Write results onto theory if there is no broadening etc
                ! this already is the sum over all isotopes
                call calcData%addCalculatedData(Kkkkkk, Nnnsig, ndasig,
      *                   ndbsig, -1, Sigxxx, Dasigx, Dbsigx)
-               do Jsig = 1,Nnnsig
-                  ! get cross section (position=0) at energy point
-                  ! Kkkkkk and section Jsig
-                  Theory(Jsig,Jdat) =
-     *                  calcData%getDataNs(Kkkkkk, Jsig, 0, 1)
-               end do
             END IF
             cycle
 C
@@ -172,13 +152,8 @@ C ********* copy results if there is broadening
 C ****** end of do-loop on energies
 C
 C
-      IF (Ywhich .OR. Maxwel.EQ.1 .OR. Knocor.EQ.1) THEN
-         Kkkmin = Kkkmin - 1
-         CALL Write_Cross_Sections (calcData,
-     *          Nnnsig, numE, Kkkmin, 0)
-      END IF
 C
-      IF (Kpiece.EQ.1) CALL Odfpcs (Dum, Pieces)
+         IF (Kpiece.EQ.1) CALL Odfpcs (Dum, Pieces)
 C
       call grid%destroy()
       RETURN
@@ -218,40 +193,3 @@ C
       END IF
       RETURN
       END
-C
-C
-C --------------------------------------------------------------
-C
-      Subroutine Fix_Eta (Iflmsc, Sigxxx, Dasigx, Dbsigx)
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Iflmsc(*), Sigxxx(Nnnsig,*), Dasigx(Nnnsig,*),
-     *  Dbsigx(Nnnsig,Ndbxxx,*)
-C *** Here we are generating eta = nu * (fission/absorption)
-      DO Iso=1,Nnniso
-         Sigma = Sigxxx(1,iso)
-         F = Sigxxx(2,Iso)
-         A = Sigxxx(1,Iso) - F
-         Sigxxx(1,Iso) = F/Sigma*Etanuu
-         IF (Ksolve.NE.2) THEN
-            IF (Ndasig.GT.0) THEN  ! cro and mlb only ever have one nuclide
-               DO Ipar=1,Ndasig
-                   Dasigx(1,Ipar) = Etanuu *
-     *                     ( Dasigx(2,Ipar)*(A/Sigma)
-     *                     - Dasigx(1,Ipar)*(F/Sigma) )/Sigma
-               END DO
-            END IF
-            IF (Ndbsig.GT.0) THEN
-               DO Ipar=1,Ndbsig
-                  Dbsigx(1,Ipar,Iso) = Etanuu *
-     *                        ( Dbsigx(2,Ipar,Iso)*(A/Sigma)
-     *                        - Dbsigx(1,Ipar,Iso)*(F/Sigma) )/Sigma
-               END DO
-            END IF
-         END IF
-         CALL Nnneta (Iflmsc, Sigxxx, Dbsigx, Nnnsig, Nnniso)
-      END DO
-      RETURN
-      END
diff --git a/sammy/src/cro/mnrm1.f b/sammy/src/cro/mnrm1.f
deleted file mode 100644
index d813517f7c484789cfa82731347203a46c5c5455..0000000000000000000000000000000000000000
--- a/sammy/src/cro/mnrm1.f
+++ /dev/null
@@ -1,359 +0,0 @@
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Norm (Parnbk, Iflnbk, Sig, dA, dB, Em, Nummmm)
-C
-C *** Purpose -- Add backgrounds
-C
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use broad_common_m
-      use abro_common_m
-      use cbro_common_m
-      use lbro_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-C
-      DIMENSION Sig(*), dA(Nummmm,*), dB(Nummmm,*), Iflnbk(6,*),
-     *   Parnbk(6,*)
-C      DIMENSION Sig(Nummmm), dA(.,Ndasig), dB(.,Ndbsig), 
-C     *   Iflnbk(6,Nangle), Parnbk(6,Nangle)
-      DATA Zero /0.0d0/, One /1.0d0/
-C
-      IF (Nnniso.NE.1) STOP '[STOP in Norm in cro/mnrm1.f]'
-C
-      IF (Numnbk.GT.6) GO TO 50
-C
-C *** Here is original, with only one set of normalization/backgrounds
-C ***    that work for all cross sections
-      DO Nn=1,Nummmm
-         Sig(Nn) = Sig(Nn)*Anorm
-      END DO
-      IF (Ndasig.GT.0) THEN
-         DO J=1,Ndasig
-            DO Nn=1,Nummmm
-               IF (dA(Nn,J).NE.Zero) dA(Nn,J) = dA(Nn,J)*Anorm
-            END DO
-         END DO
-      END IF
-      IF (Ndbsig.GT.0) THEN
-         DO J=1,Ndbsig
-            DO Nn=1,Nummmm
-               IF (dB(Nn,J).NE.Zero) dB(Nn,J) = dB(Nn,J)*Anorm
-            END DO
-         END DO
-      END IF
-C
-      Se = dSQRT(Em)
-      IF (Ksolve.NE.2 .OR. Nfpnbk.GT.Nvpnbk) THEN
-         N = Ndasig
-         DO I=1,Nummmm
-            IF (Kvnorm.GT.0) dB(I,Iflnbk(1,1)-N) = Sig(I)/Anorm
-            IF (KvbckA.GT.0) dB(I,Iflnbk(2,1)-N) = One
-            IF (KvbckB.GT.0) dB(I,Iflnbk(3,1)-N) = One/Se
-            IF (KvbckC.GT.0) dB(I,Iflnbk(4,1)-N) = Se
-            IF (KvbckD.GT.0) dB(I,Iflnbk(5,1)-N) = dEXP(-BackF/Se)
-            IF (KvbckF.GT.0) dB(I,Iflnbk(6,1)-N) =-BackD*dEXP(-BackF/Se)
-         END DO
-      ELSE
-      END IF
-C
-C
-      DO I=1,Nummmm
-         IF (BackA.NE.Zero) Sig(I) = Sig(I) + BackA
-         IF (BackB.NE.Zero) Sig(I) = Sig(I) + BackB/Se
-         IF (BackC.NE.Zero) Sig(I) = Sig(I) + BackC*Se
-         IF (BackD.NE.Zero) Sig(I) = Sig(I) + BackD*dEXP(-BackF/Se)
-      END DO
-      RETURN
-C
-C
-C *** here is for different normalizations for different cross sections
-   50 CONTINUE
-      DO Iangle=1,Nummmm
-         IF (Sig(Iangle).NE.Zero) Sig(Iangle) =
-     *      Sig(Iangle)*Parnbk(1,Iangle)
-      END DO
-      IF (Ndasig.GT.0) THEN
-         DO Ipar=1,Ndasig
-            DO Iangle=1,Nummmm
-               IF (dA(Iangle,Ipar).NE.Zero) dA(Iangle,Ipar) =
-     *             dA(Iangle,Ipar)*Parnbk(1,Iangle)
-            END DO
-         END DO
-      END IF
-      IF (Ndbsig.GT.0) THEN
-         DO Ipar=1,Ndbsig
-            DO Iangle=1,Nummmm
-               IF (dB(Iangle,Ipar).NE.Zero) dB(Iangle,Ipar) =
-     *             dB(Iangle,Ipar)*Parnbk(1,Iangle)
-            END DO
-         END DO
-      END IF
-C
-      Se = dSQRT(Em)
-      IF (Ksolve.NE.2 .OR. Nfpnbk.GT.Nvpnbk) THEN
-         N = Ndasig
-         DO Iangle=1,Nummmm
-            IF (Iflnbk(1,Iangle).GT.N) dB(Iangle,Iflnbk(1,Iangle)-N) =
-     *         Sig(Iangle)/Parnbk(1,Iangle)
-            IF (Iflnbk(2,Iangle).GT.N) dB(Iangle,Iflnbk(2,Iangle)-N) =
-     *         One
-            IF (Iflnbk(3,Iangle).GT.N) dB(Iangle,Iflnbk(3,Iangle)-N) =
-     *         One/Se
-            IF (Iflnbk(4,Iangle).GT.N) dB(Iangle,Iflnbk(4,Iangle)-N) =
-     *         dB(Iangle,Iflnbk(4,Iangle)-N) + Se
-            IF (Iflnbk(5,Iangle).GT.N) dB(Iangle,Iflnbk(5,Iangle)-N) =
-     *         dEXP(-Parnbk(6,Iangle)/Se)
-            IF (Iflnbk(6,Iangle).GT.N) dB(Iangle,Iflnbk(6,Iangle)-N) =
-     *         - Parnbk(5,Iangle)*dEXP(-Parnbk(6,Iangle)/Se)
-         END DO
-      END IF
-C
-C
-      DO Iangle=1,Nummmm
-         IF (Parnbk(2,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +
-     *                                          Parnbk(2,Iangle)
-         IF (Parnbk(3,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +
-     *                                          Parnbk(3,Iangle)/Se
-         IF (Parnbk(4,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +
-     *                                          Parnbk(4,Iangle)*Se
-         IF (Parnbk(5,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +
-     *                    Parnbk(5,Iangle)*EXP(-Parnbk(6,Iangle)/Se)
-      END DO
-      RETURN
-      END
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Bgfrpi (Parbgf, Iflbgf, Kndbgf, Bgfmin, Bgfmax,
-     *   Texbgf, Teabgf, Sig, dB, Em, Nummmm)
-C
-C *** Purpose -- Add background functions
-C
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use broad_common_m
-      use abro_common_m
-      use cbro_common_m
-      use lbro_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-C
-      DIMENSION Sig(*), db(Nummmm,*), Iflbgf(*),
-     *   Parbgf(*), Kndbgf(*), Bgfmin(*), Bgfmax(*),
-     *   Texbgf(Ntepnt,*), Teabgf(Ntepnt,*)
-C      DIMENSION Sig(Nummmm), dB(.,Ndbsig), Parbgf(Numbgf),
-C        Iflbgf(Numbgf), Kndbgf(Numbgf), Bgfmin(Numbgf), Bgfmax(Numbgf),
-C        Texbgf(Ntepnt,Ntefil), Teabgf(Ntepnt,Ntefil)
-      DATA Zero /0.0d0/, One /1.0d0/
-C
-      N = Ndasig
-      IF (Nnniso.NE.1) STOP '[STOP in Bgfrpi in cro/mnrm1.f]'
-C
-      DO I=1,Numbgf
-C
-         IF (Kndbgf(I).EQ.1) THEN
-C ***       constant
-            IF (Bgfmin(I).EQ.Zero .OR. Em.GT.Bgfmin(I)) THEN
-               IF (Bgfmax(I).EQ.Zero .OR. Em.LE.Bgfmax(I)) THEN
-                  Exx = Parbgf(I)
-                  Sig(1) = Sig(1) + Exx
-                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-                     IF (Iflbgf(I).GT.N) dB(1,Iflbgf(I)-N) = One
-                  END IF
-               END IF
-            END IF
-C
-         ELSE IF (Kndbgf(I).EQ.2) THEN
-C ***       exponential
-            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
-               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
-                  Exx = dEXP(-Parbgf(I+1)*Ttoe/dSQRT(Em))
-                  Sig(1) = Sig(1) + Parbgf(I)*Exx
-                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
-                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =
-     *                          -Parbgf(I)*Exx*(Ttoe/dSQRT(Em))
-                  END IF
-               END IF
-            END IF
-C
-         ELSE IF (Kndbgf(I).EQ.3) THEN
-C ***       power function
-            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
-               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
-                  T = Ttoe/dSQRT(Em)
-                  Exx = T**Parbgf(I+1)
-                  Sig(1) = Sig(1) + Parbgf(I)*Exx
-                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
-                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =
-     *                                    Parbgf(I)*Exx*dLOG(T)
-                  END IF
-               END IF
-            END IF
-C
-         ELSE IF (Kndbgf(I).EQ.4) THEN
-C ***       exponential of logarithmic function
-            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
-               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
-                  T = Ttoe/dSQRT(Em)
-                  Exx = Parbgf(I) + T*Parbgf(I+1) + Parbgf(I+2)/dLOG(T)
-                  Exx = dEXP(Exx)
-                  Sig(1) = Sig(1) + Exx
-                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
-                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) = Exx*T
-                     IF (Iflbgf(I+2).GT.N) dB(1,Iflbgf(I+2)-N) = Exx/
-     *                                                           dLOG(T)
-                  END IF
-               END IF
-            END IF
-C
-         ELSE IF (Kndbgf(I).EQ.5 .AND. Kndbgf(I+1).EQ.5) THEN
-C ***       point-wise function in time
-            T = Ttoe/dSQRT(Em)
-            IF (T.GE.Bgfmin(I)) THEN
-               IF (T.LT.Bgfmin(I+1)) THEN
-                  D = Bgfmin(I+1) - Bgfmin(I)
-                  A = (Bgfmin(I+1)-T)/D
-                  B = (T-Bgfmin(I))/D
-                  Sig(1) = Sig(1) + A*Parbgf(I) + B*Parbgf(I+1)
-                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = 
-     *                                     dB(1,Iflbgf(I  )-N) + A
-                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =
-     *                                     dB(1,Iflbgf(I+1)-N) + B
-                  END IF
-               END IF
-            END IF
-C
-         ELSE IF (Kndbgf(I).EQ.6 .AND. Kndbgf(I+1).EQ.6) THEN
-C ***       point-wise function in Energy
-            IF (Em.GE.Bgfmin(I)) THEN
-               IF (Em.LT.Bgfmin(I+1)) THEN
-                  D = Bgfmin(I+1) - Bgfmin(I)
-                  A = (Bgfmin(I+1)-Em)/D
-                  B = (Em-Bgfmin(I))/D
-                  Sig(1) = Sig(1) + A*Parbgf(I) + B*Parbgf(I+1)
-                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = 
-     *                                     dB(1,Iflbgf(I  )-N) + A
-                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =
-     *                                     dB(1,Iflbgf(I+1)-N) + B
-                  END IF
-               END IF
-            END IF
-C
-         ELSE IF (Kndbgf(I).GT.1000 .AND. Kndbgf(I).LE.2000) THEN
-C ***       point-wise function in time, multiplier is variable
-            T = Ttoe/dSQRT(Em)
-            Itefil = Kndbgf(I) - 1000
-            CALL Find_Te (T, Texbgf(1,Itefil), Ntepnt, Nte)
-            IF (Nte.EQ.0) THEN
-               S = Zero
-            ELSE IF (Nte.LT.0) THEN
-               S = Teabgf(-Nte,Itefil)
-               Sig(1) = Sig(1) + Parbgf(I)*S
-            ELSE
-               D = Texbgf(Nte+1,Itefil) - Texbgf(Nte,Itefil)
-               A = (Texbgf(Nte+1,Itefil)-T)/D
-               B = (T-Texbgf(Nte,Itefil))/D
-               S = A*Teabgf(Nte,Itefil) + B*Teabgf(Nte+1,Itefil)
-            END IF
-            Sig(1) = Sig(1) + Parbgf(I)*S
-            IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-               IF (Iflbgf(I).GT.N) dB(1,Iflbgf(I)-N) =
-     *                             dB(1,Iflbgf(I)-N) + S
-            END IF
-C
-         ELSE IF (Kndbgf(I).GT.2000) THEN
-C ***       point-wise function in energy, multiplier is variable
-            Itefil = Kndbgf(I) - 2000
-            CALL Find_Te (Em, Texbgf(1,Itefil), Ntepnt, Nte)
-            IF (Nte.EQ.0) THEN
-               S = Zero
-            ELSE IF (Nte.LT.0) THEN
-               S = Teabgf(-Nte,Itefil)
-               Sig(1) = Sig(1) + Parbgf(I)*S
-            ELSE
-               D = Texbgf(Nte+1,Itefil) - Texbgf(Nte,Itefil)
-               A = (Texbgf(Nte+1,Itefil)-Em)/D
-               B = (Em-Texbgf(Nte,Itefil))/D
-               S = A*Teabgf(Nte,Itefil) + B*Teabgf(Nte+1,Itefil)
-            END IF
-            Sig(1) = Sig(1) + Parbgf(I)*S
-            IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-               IF (Iflbgf(I).GT.N) dB(1,Iflbgf(I)-N) = 
-     *                             dB(1,Iflbgf(I)-N) + S
-            END IF
-C
-         ELSE IF (Kndbgf(I).EQ.9) THEN
-C ***       A*E^(-B)
-            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
-               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
-                  Exx = Em**(-Parbgf(I+1))
-                  Sig(1) = Sig(1) + Parbgf(I)*Exx
-                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
-                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
-                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =
-     *                          - dLOG(Em)*Sig(1)
-                  END IF
-               END IF
-            END IF
-C
-         END IF
-      END DO
-      RETURN
-      END
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Nnneta (Iflmsc, Sig, Dbsig, Na, Niso)
-C
-C *** Purpose -- Generate derivative with respect to NU
-C
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-C
-      DIMENSION Sig(Na,*), Dbsig(Na,Ndbxxx,*), Iflmsc(*)
-C
-      IF (Kjetan.LE.0) RETURN
-      IF (Iflmsc(Kjetan).EQ.0) RETURN
-      N = Iflmsc(Kjetan)
-      IF (N.LE.Ndasig) THEN
-         STOP '[STOP in Nnneta in cro/mnrm1.f]'
-      ELSE
-         DO Iso=1,Niso
-            Dbsig(1,N,Iso) = Sig(1,Iso)/Etanuu
-         END DO
-      END IF
-      RETURN
-      END
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Find_Te (T, Tt, Ntepnt, Nte)
-C *** Purpose -- Find position Nte such that Tt(Nte).LE.T.LT.Tt(Nte+1)
-      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
-      DIMENSION Tt(*)
-      DATA Zero /0.0d0/
-      Nte = 0
-      DO I=1,Ntepnt
-         IF (I.GT.1 .AND. Tt(I).EQ.Zero) RETURN
-         IF (T.LT.Tt(I)) THEN
-            Nte = I - 1
-            RETURN
-         ELSE IF (T.EQ.Tt(I)) THEN
-            Nte = - I
-         END IF
-      END DO
-      RETURN
-      END
diff --git a/sammy/src/cro/mnrm1.f90 b/sammy/src/cro/mnrm1.f90
new file mode 100644
index 0000000000000000000000000000000000000000..299f38160e7ecbb6d2e0af72db5ccd74a758403d
--- /dev/null
+++ b/sammy/src/cro/mnrm1.f90
@@ -0,0 +1,727 @@
+module normalize_and_background
+contains
+!
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Norm (Parnbk, Iflnbk, Sig, dA, dB, Em, Nummmm)
+!
+! *** Purpose -- Add backgrounds
+!
+      use fixedi_m, only : Ndasig, Ndbsig, Nfpnbk, Numbgf, Numnbk, Nvpnbk, Nnniso
+      use ifwrit_m, only : KvbckA, KvbckB, KvbckC, KvbckD, KvbckF, Kvnorm, Ksolve
+      use fixedr_m, only : Anorm, BackA, BackB, BackC, BackD, BackF
+      IMPLICIT None
+!
+       real(kind=8)::Sig(*), dA(Nummmm,*), dB(Nummmm,*), Parnbk(6,*)
+       integer:: Iflnbk(6,*)
+       integer::Nummmm
+       real(kind=8)::Em
+!      DIMENSION Sig(Nummmm), dA(.,Ndasig), dB(.,Ndbsig),
+!     *   Iflnbk(6,Nangle), Parnbk(6,Nangle)
+      real(kind=8),parameter::Zero=0.0d0, One=1.0d0
+      integer::I, Iangle, J, N, Nn, Ipar
+      real(kind=8)::Se
+
+!
+      IF (Nnniso.NE.1) STOP '[STOP in Norm in cro/mnrm1.f]'
+!
+      IF (Numnbk.GT.6) GO TO 50
+!
+! *** Here is original, with only one set of normalization/backgrounds
+! ***    that work for all cross sections
+      DO Nn=1,Nummmm
+         Sig(Nn) = Sig(Nn)*Anorm
+      END DO
+      IF (Ndasig.GT.0) THEN
+         DO J=1,Ndasig
+            DO Nn=1,Nummmm
+               IF (dA(Nn,J).NE.Zero) dA(Nn,J) = dA(Nn,J)*Anorm               
+            END DO
+         END DO
+      END IF
+      IF (Ndbsig.GT.0) THEN
+         DO J=1,Ndbsig
+            DO Nn=1,Nummmm
+               IF (dB(Nn,J).NE.Zero) dB(Nn,J) = dB(Nn,J)*Anorm
+            END DO
+         END DO
+      END IF
+!
+      Se = dSQRT(Em)
+      IF (Ksolve.NE.2 .OR. Nfpnbk.GT.Nvpnbk) THEN
+         N = Ndasig
+         DO I=1,Nummmm
+            IF (Kvnorm.GT.0) dB(I,Iflnbk(1,1)-N) = Sig(I)/Anorm
+            IF (KvbckA.GT.0) dB(I,Iflnbk(2,1)-N) = One
+            IF (KvbckB.GT.0) dB(I,Iflnbk(3,1)-N) = One/Se
+            IF (KvbckC.GT.0) dB(I,Iflnbk(4,1)-N) = Se
+            IF (KvbckD.GT.0) dB(I,Iflnbk(5,1)-N) = dEXP(-BackF/Se)
+            IF (KvbckF.GT.0) dB(I,Iflnbk(6,1)-N) =-BackD*dEXP(-BackF/Se)
+         END DO
+      ELSE
+      END IF
+!
+!
+      DO I=1,Nummmm
+         IF (BackA.NE.Zero) Sig(I) = Sig(I) + BackA
+         IF (BackB.NE.Zero) Sig(I) = Sig(I) + BackB/Se
+         IF (BackC.NE.Zero) Sig(I) = Sig(I) + BackC*Se
+         IF (BackD.NE.Zero) Sig(I) = Sig(I) + BackD*dEXP(-BackF/Se)
+      END DO
+      RETURN
+!
+!
+! *** here is for different normalizations for different cross sections
+   50 CONTINUE
+      DO Iangle=1,Nummmm
+         IF (Sig(Iangle).NE.Zero) Sig(Iangle) =  &
+            Sig(Iangle)*Parnbk(1,Iangle)
+      END DO
+      IF (Ndasig.GT.0) THEN
+         DO Ipar=1,Ndasig
+            DO Iangle=1,Nummmm
+               IF (dA(Iangle,Ipar).NE.Zero) dA(Iangle,Ipar) = &
+                   dA(Iangle,Ipar)*Parnbk(1,Iangle)
+            END DO
+         END DO
+      END IF
+      IF (Ndbsig.GT.0) THEN
+         DO Ipar=1,Ndbsig
+            DO Iangle=1,Nummmm
+               IF (dB(Iangle,Ipar).NE.Zero) dB(Iangle,Ipar) =  &
+                   dB(Iangle,Ipar)*Parnbk(1,Iangle)
+            END DO
+         END DO
+      END IF
+!
+      Se = dSQRT(Em)
+      IF (Ksolve.NE.2 .OR. Nfpnbk.GT.Nvpnbk) THEN
+         N = Ndasig
+         DO Iangle=1,Nummmm
+            IF (Iflnbk(1,Iangle).GT.N) dB(Iangle,Iflnbk(1,Iangle)-N) =  &
+               Sig(Iangle)/Parnbk(1,Iangle)
+            IF (Iflnbk(2,Iangle).GT.N) dB(Iangle,Iflnbk(2,Iangle)-N) =  &
+               One
+            IF (Iflnbk(3,Iangle).GT.N) dB(Iangle,Iflnbk(3,Iangle)-N) = &
+               One/Se
+            IF (Iflnbk(4,Iangle).GT.N) dB(Iangle,Iflnbk(4,Iangle)-N) = &
+               dB(Iangle,Iflnbk(4,Iangle)-N) + Se
+            IF (Iflnbk(5,Iangle).GT.N) dB(Iangle,Iflnbk(5,Iangle)-N) = &
+               dEXP(-Parnbk(6,Iangle)/Se)
+            IF (Iflnbk(6,Iangle).GT.N) dB(Iangle,Iflnbk(6,Iangle)-N) = &
+               - Parnbk(5,Iangle)*dEXP(-Parnbk(6,Iangle)/Se)
+         END DO
+      END IF
+!
+!
+      DO Iangle=1,Nummmm
+         IF (Parnbk(2,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +    &
+                                                Parnbk(2,Iangle)
+         IF (Parnbk(3,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +    &
+                                                Parnbk(3,Iangle)/Se
+         IF (Parnbk(4,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +    &
+                                                Parnbk(4,Iangle)*Se
+         IF (Parnbk(5,Iangle).NE.Zero) Sig(Iangle) = Sig(Iangle) +    &
+                          Parnbk(5,Iangle)*EXP(-Parnbk(6,Iangle)/Se)
+      END DO
+      RETURN
+      END
+
+      SUBROUTINE Norm_new (Parnbk, Iflnbk, Em, irow, calcData, wantDeriv, itot)
+!
+! *** Purpose -- Add backgrounds
+!
+      use fixedi_m, only : Numbgf, Numnbk
+      use ifwrit_m, only : KvbckA, KvbckB, KvbckC, KvbckD, KvbckF, Kvnorm
+      use fixedr_m, only : Anorm, BackA, BackB, BackC, BackD, BackF
+      use DerivativeHandler_M
+      use, intrinsic :: ISO_C_BINDING
+
+      IMPLICIT None
+!
+       real(kind=8)::Parnbk(6,*)
+       integer:: Iflnbk(6,*)
+       integer::Nummmm, irow, itot
+       logical::wantDeriv
+       type(DerivativeHandler)::calcData
+       real(kind=8)::Em
+!      DIMENSION  Iflnbk(6,Nangle), Parnbk(6,Nangle)
+      real(kind=8),parameter::Zero=0.0d0, One=1.0d0
+      integer::I, Iangle, J, Nn, Ipar, ourItot
+      logical(C_BOOL)::accumulate, empty
+      real(kind=8)::Se, val, Sig
+
+      accumulate = .false.
+      call calcData%setAccumulate(accumulate)
+      empty = .true.
+      call calcData%setNotSetReturnsZero(empty)
+
+       ourItot  = itot
+       if (.not.wantDeriv) ourItot = 1
+       Nummmm = calcData%getNnnsig()
+
+!
+      IF (Numnbk.GT.6) GO TO 50
+!
+! *** Here is original, with only one set of normalization/backgrounds
+! ***    that work for all cross sections
+      DO Nn=1,Nummmm
+         do I = 0, ourItot
+             val = calcData%getSharedValNs(irow, Nn, I) * Anorm
+             if (val.ne.Zero) then
+                 call calcData%setSharedValNs(irow, Nn, I, val)
+              end if
+          end do
+      END DO
+
+      Se = dSQRT(Em)
+      IF (wantDeriv) THEN
+         DO I=1,Nummmm
+            Sig = calcData%getSharedValNs(irow, I, 0)
+            IF (Kvnorm.GT.0) call calcData%setSharedValNs(irow, I, Iflnbk(1,1), Sig/Anorm)
+            IF (KvbckA.GT.0) call calcData%setSharedValNs(irow, I, Iflnbk(2,1), One)
+            IF (KvbckB.GT.0) call calcData%setSharedValNs(irow, I, Iflnbk(3,1), One/Se)
+            IF (KvbckC.GT.0) call calcData%setSharedValNs(irow, I, Iflnbk(4,1), Se)
+            IF (KvbckD.GT.0) call calcData%setSharedValNs(irow, I, Iflnbk(5,1), dEXP(-BackF/Se))
+            IF (KvbckF.GT.0) call calcData%setSharedValNs(irow, I, Iflnbk(6,1), -BackD*dEXP(-BackF/Se))
+         END DO
+      ELSE
+      END IF
+!
+!
+      accumulate = .true.
+      call calcData%setAccumulate(accumulate)
+      DO I=1,Nummmm
+         IF (BackA.NE.Zero) call calcData%setSharedValNs(irow, I, 0, BackA)
+         IF (BackB.NE.Zero) call calcData%setSharedValNs(irow, I, 0, BackB/Se)
+         IF (BackC.NE.Zero) call calcData%setSharedValNs(irow, I, 0, BackC*Se)
+         IF (BackD.NE.Zero) call calcData%setSharedValNs(irow, I, 0, BackD*dEXP(-BackF/Se))
+      END DO
+      accumulate = .false.
+      call calcData%setAccumulate(accumulate)
+      empty = .false.
+      call calcData%setNotSetReturnsZero(empty)
+      RETURN
+!
+!
+! *** here is for different normalizations for different cross sections
+   50 CONTINUE
+      DO Iangle=1,Nummmm
+         do I = 0, ourItot
+            val = calcData%getSharedValNs(irow, Iangle, I)
+            if (val.ne.Zero) then
+               val = val * Parnbk(1,Iangle)
+               call calcData%setSharedValNs(irow, Iangle, I, val)
+            end if
+         end do
+      END DO
+!
+      Se = dSQRT(Em)
+      IF (wantDeriv) THEN
+         DO Iangle=1,Nummmm
+            Sig = calcData%getSharedValNs(irow, Iangle, 0)
+            IF (Iflnbk(1,Iangle).GT.0) then
+               call calcData%setSharedValNs(irow, Iangle, Iflnbk(1,Iangle), Sig/Parnbk(1,Iangle))
+            end if
+            IF (Iflnbk(2,Iangle).GT.0) then
+                call calcData%setSharedValNs(irow, Iangle, Iflnbk(2,Iangle),  One)
+            end if
+            IF (Iflnbk(3,Iangle).GT.0) then
+               call calcData%setSharedValNs(irow, Iangle, Iflnbk(3,Iangle),  One/Se)
+            end if
+            IF (Iflnbk(4,Iangle).GT.0) then
+                val = calcData%getSharedValNs(irow, Iangle, Iflnbk(4,Iangle)) + Se
+                call calcData%setSharedValNs(irow, Iangle, Iflnbk(4,Iangle), val)
+            end if
+            IF (Iflnbk(5,Iangle).GT.0) then
+               call calcData%setSharedValNs(irow, Iangle, Iflnbk(5,Iangle), dEXP(-Parnbk(6,Iangle)/Se))
+            end if
+            IF (Iflnbk(6,Iangle).GT.0) then
+                call calcData%setSharedValNs(irow, Iangle, Iflnbk(6,Iangle), - Parnbk(5,Iangle)*dEXP(-Parnbk(6,Iangle)/Se))
+            end if
+         END DO
+      END IF
+!
+!
+      accumulate = .true.
+      call calcData%setAccumulate(accumulate)
+      DO Iangle=1,Nummmm
+         IF (Parnbk(2,Iangle).NE.Zero) call calcData%setSharedValNs(irow, Iangle, 0, Parnbk(2,Iangle))
+         IF (Parnbk(3,Iangle).NE.Zero) call calcData%setSharedValNs(irow, Iangle, 0, Parnbk(3,Iangle)/Se)
+         IF (Parnbk(4,Iangle).NE.Zero) call calcData%setSharedValNs(irow, Iangle, 0, Parnbk(4,Iangle)*Se)
+         IF (Parnbk(5,Iangle).NE.Zero) call calcData%setSharedValNs(irow, Iangle, 0, Parnbk(5,Iangle)*EXP(-Parnbk(6,Iangle)/Se))
+      END DO
+      accumulate = .false.
+      call calcData%setAccumulate(accumulate)
+      empty = .false.
+      call calcData%setNotSetReturnsZero(empty)
+      RETURN
+      END
+!
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Bgfrpi (Parbgf, Iflbgf, Kndbgf, Bgfmin, Bgfmax,  &
+         Texbgf, Teabgf, Sig, dB, Em, Nummmm)
+!
+! *** Purpose -- Add background functions
+!
+      use fixedi_m, only : Ntepnt, Ndasig, Nfpbgf, Nnniso, Numbgf, Nvpbgf
+      use ifwrit_m, only : Ksolve
+      use fixedr_m, only : Ttoe
+      IMPLICIT NONE
+!
+      real(kind=8)::Sig(*), db(Nummmm,*),      &
+         Parbgf(*), Bgfmin(*), Bgfmax(*),   &
+         Texbgf(Ntepnt,*), Teabgf(Ntepnt,*)
+     integer::Iflbgf(*), Kndbgf(*)
+
+!      DIMENSION Sig(Nummmm), dB(.,Ndbsig), Parbgf(Numbgf),
+!        Iflbgf(Numbgf), Kndbgf(Numbgf), Bgfmin(Numbgf), Bgfmax(Numbgf),
+!        Texbgf(Ntepnt,Ntefil), Teabgf(Ntepnt,Ntefil)
+      real(kind=8),parameter::Zero=0.0d0, One=1.0d0
+      real(kind=8)::Em
+      integer::Nummmm
+      real(kind=8)::A, B, D, Exx, S, T
+      integer::I, Itefil, N, Nte
+!
+      N = Ndasig
+      IF (Nnniso.NE.1) STOP '[STOP in Bgfrpi in cro/mnrm1.f]'
+!
+      DO I=1,Numbgf
+!
+         IF (Kndbgf(I).EQ.1) THEN
+! ***       constant
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GT.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LE.Bgfmax(I)) THEN
+                  Exx = Parbgf(I)
+                  Sig(1) = Sig(1) + Exx
+                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+                     IF (Iflbgf(I).GT.N) dB(1,Iflbgf(I)-N) = One
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.2) THEN
+! ***       exponential
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  Exx = dEXP(-Parbgf(I+1)*Ttoe/dSQRT(Em))
+                  Sig(1) = Sig(1) + Parbgf(I)*Exx
+                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
+                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) = &
+                                -Parbgf(I)*Exx*(Ttoe/dSQRT(Em))
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.3) THEN
+! ***       power function
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  T = Ttoe/dSQRT(Em)
+                  Exx = T**Parbgf(I+1)
+                  Sig(1) = Sig(1) + Parbgf(I)*Exx
+                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
+                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =  &
+                                          Parbgf(I)*Exx*dLOG(T)
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.4) THEN
+! ***       exponential of logarithmic function
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  T = Ttoe/dSQRT(Em)
+                  Exx = Parbgf(I) + T*Parbgf(I+1) + Parbgf(I+2)/dLOG(T)
+                  Exx = dEXP(Exx)
+                  Sig(1) = Sig(1) + Exx
+                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
+                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) = Exx*T
+                     IF (Iflbgf(I+2).GT.N) dB(1,Iflbgf(I+2)-N) = Exx/dLOG(T)
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.5 .AND. Kndbgf(I+1).EQ.5) THEN
+! ***       point-wise function in time
+            T = Ttoe/dSQRT(Em)
+            IF (T.GE.Bgfmin(I)) THEN
+               IF (T.LT.Bgfmin(I+1)) THEN
+                  D = Bgfmin(I+1) - Bgfmin(I)
+                  A = (Bgfmin(I+1)-T)/D
+                  B = (T-Bgfmin(I))/D
+                  Sig(1) = Sig(1) + A*Parbgf(I) + B*Parbgf(I+1)
+                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) =   &
+                                           dB(1,Iflbgf(I  )-N) + A
+                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =   &
+                                           dB(1,Iflbgf(I+1)-N) + B
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.6 .AND. Kndbgf(I+1).EQ.6) THEN
+! ***       point-wise function in Energy
+            IF (Em.GE.Bgfmin(I)) THEN
+               IF (Em.LT.Bgfmin(I+1)) THEN
+                  D = Bgfmin(I+1) - Bgfmin(I)
+                  A = (Bgfmin(I+1)-Em)/D
+                  B = (Em-Bgfmin(I))/D
+                  Sig(1) = Sig(1) + A*Parbgf(I) + B*Parbgf(I+1)
+                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) =    &
+                                           dB(1,Iflbgf(I  )-N) + A
+                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =    &
+                                           dB(1,Iflbgf(I+1)-N) + B
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).GT.1000 .AND. Kndbgf(I).LE.2000) THEN
+! ***       point-wise function in time, multiplier is variable
+            T = Ttoe/dSQRT(Em)
+            Itefil = Kndbgf(I) - 1000
+            CALL Find_Te (T, Texbgf(1,Itefil), Ntepnt, Nte)
+            IF (Nte.EQ.0) THEN
+               S = Zero
+            ELSE IF (Nte.LT.0) THEN
+               S = Teabgf(-Nte,Itefil)
+               Sig(1) = Sig(1) + Parbgf(I)*S
+            ELSE
+               D = Texbgf(Nte+1,Itefil) - Texbgf(Nte,Itefil)
+               A = (Texbgf(Nte+1,Itefil)-T)/D
+               B = (T-Texbgf(Nte,Itefil))/D
+               S = A*Teabgf(Nte,Itefil) + B*Teabgf(Nte+1,Itefil)
+            END IF
+            Sig(1) = Sig(1) + Parbgf(I)*S
+            IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+               IF (Iflbgf(I).GT.N) dB(1,Iflbgf(I)-N) =    &
+                                   dB(1,Iflbgf(I)-N) + S
+            END IF
+!
+         ELSE IF (Kndbgf(I).GT.2000) THEN
+! ***       point-wise function in energy, multiplier is variable
+            Itefil = Kndbgf(I) - 2000
+            CALL Find_Te (Em, Texbgf(1,Itefil), Ntepnt, Nte)
+            IF (Nte.EQ.0) THEN
+               S = Zero
+            ELSE IF (Nte.LT.0) THEN
+               S = Teabgf(-Nte,Itefil)
+               Sig(1) = Sig(1) + Parbgf(I)*S
+            ELSE
+               D = Texbgf(Nte+1,Itefil) - Texbgf(Nte,Itefil)
+               A = (Texbgf(Nte+1,Itefil)-Em)/D
+               B = (Em-Texbgf(Nte,Itefil))/D
+               S = A*Teabgf(Nte,Itefil) + B*Teabgf(Nte+1,Itefil)
+            END IF
+            Sig(1) = Sig(1) + Parbgf(I)*S
+            IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+               IF (Iflbgf(I).GT.N) dB(1,Iflbgf(I)-N) =     &
+                                   dB(1,Iflbgf(I)-N) + S
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.9) THEN
+! ***       A*E^(-B)
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  Exx = Em**(-Parbgf(I+1))
+                  Sig(1) = Sig(1) + Parbgf(I)*Exx
+                  IF (Ksolve.NE.2 .OR. Nfpbgf.GT.Nvpbgf) THEN
+                     IF (Iflbgf(I  ).GT.N) dB(1,Iflbgf(I  )-N) = Exx
+                     IF (Iflbgf(I+1).GT.N) dB(1,Iflbgf(I+1)-N) =  &
+                                - dLOG(Em)*Sig(1)
+                  END IF
+               END IF
+            END IF
+!
+         END IF
+      END DO
+      RETURN
+      END
+!
+      SUBROUTINE Bgfrpi_new (Parbgf, Iflbgf, Kndbgf, Bgfmin, Bgfmax,  &
+         Texbgf, Teabgf, Em, calcData, irow, wantDeriv)
+!
+! *** Purpose -- Add background functions
+!
+      use fixedi_m, only : Ntepnt,  Numbgf
+      use ifwrit_m, only : Ksolve
+      use fixedr_m, only : Ttoe
+      use DerivativeHandler_M
+      IMPLICIT NONE
+!
+     real(kind=8):: Parbgf(*), Bgfmin(*), Bgfmax(*),   &
+                    Texbgf(Ntepnt,*), Teabgf(Ntepnt,*)
+     integer::Iflbgf(*), Kndbgf(*)
+     type(DerivativeHandler)::calcData
+     integer::irow, itot
+     logical::wantDeriv
+
+!      DIMENSION Parbgf(Numbgf),
+!        Iflbgf(Numbgf), Kndbgf(Numbgf), Bgfmin(Numbgf), Bgfmax(Numbgf),
+!        Texbgf(Ntepnt,Ntefil), Teabgf(Ntepnt,Ntefil)
+      real(kind=8),parameter::Zero=0.0d0, One=1.0d0
+      real(kind=8)::Em, val, sig
+      real(kind=8)::A, B, D, Exx, S, T
+      integer::I, Itefil, Nte
+!
+!     ! for this routine isig = 1 always
+!
+      DO I=1,Numbgf
+!
+         IF (Kndbgf(I).EQ.1) THEN
+! ***       constant
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GT.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LE.Bgfmax(I)) THEN
+                  Exx = calcData%getSharedValNs(irow, 1, 0) + Parbgf(I)
+                  call calcData%setSharedValNs(irow, 1, 0, Exx)
+                  IF (wantDeriv) THEN
+                     IF (Iflbgf(I).GT.0) then
+                      call calcData%setSharedValNs(irow, 1, Iflbgf(I), One)
+                     end if
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.2) THEN
+! ***       exponential
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  Exx = dEXP(-Parbgf(I+1)*Ttoe/dSQRT(Em))
+                  val = calcData%getSharedValNs(irow, 1, 0)  + Parbgf(I)*Exx
+                  call calcData%setSharedValNs(irow, 1, 0, val)
+                  IF (wantDeriv) THEN
+                     IF (Iflbgf(I  ).GT.0) then
+                         call calcData%setSharedValNs(irow, 1, Iflbgf(I  ), Exx)
+                     end if
+                     IF (Iflbgf(I+1).GT.0) then
+                        val = -Parbgf(I)*Exx*(Ttoe/dSQRT(Em))
+                        call calcData%setSharedValNs(irow, 1, Iflbgf(I+1), val)
+                     end if
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.3) THEN
+! ***       power function
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  T = Ttoe/dSQRT(Em)
+                  Exx = T**Parbgf(I+1)
+                  val = calcData%getSharedValNs(irow, 1, 0)  + Parbgf(I)*Exx
+                  call calcData%setSharedValNs(irow, 1, 0, val)
+                  IF (wantDeriv) THEN
+                     IF (Iflbgf(I  ).GT.0) then
+                         call calcData%setSharedValNs(irow, 1, Iflbgf(I  ),  Exx)
+                     end if
+                     IF (Iflbgf(I+1).GT.0) then
+                        val = Parbgf(I)*Exx*dLOG(T)
+                        call calcData%setSharedValNs(irow, 1, Iflbgf(I+1),  val)
+                     end if
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.4) THEN
+! ***       exponential of logarithmic function
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  T = Ttoe/dSQRT(Em)
+                  Exx = Parbgf(I) + T*Parbgf(I+1) + Parbgf(I+2)/dLOG(T)
+                  Exx = dEXP(Exx)
+                  val = Exx + calcData%getSharedValNs(irow, 1, 0)
+                  call calcData%setSharedValNs(irow, 1, 0, val)
+                  IF (wantDeriv) THEN
+                     IF (Iflbgf(I  ).GT.0) then
+                         call calcData%setSharedValNs(irow, 1,Iflbgf(I  ), Exx)
+                     end if
+                     IF (Iflbgf(I+1).GT.0) then
+                        call calcData%setSharedValNs(irow, 1,Iflbgf(I+1), Exx*T)
+                     end if
+                     IF (Iflbgf(I+2).GT.0) then
+                        val = Exx/dLOG(T)
+                        call calcData%setSharedValNs(irow, 1,Iflbgf(I+2), val)
+                     end if
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.5 .AND. Kndbgf(I+1).EQ.5) THEN
+! ***       point-wise function in time
+            T = Ttoe/dSQRT(Em)
+            IF (T.GE.Bgfmin(I)) THEN
+               IF (T.LT.Bgfmin(I+1)) THEN
+                  D = Bgfmin(I+1) - Bgfmin(I)
+                  A = (Bgfmin(I+1)-T)/D
+                  B = (T-Bgfmin(I))/D
+                  val = calcData%getSharedValNs(irow, 1, 0) + A*Parbgf(I) + B*Parbgf(I+1)
+                  call calcData%setSharedValNs(irow, 1, 0, val)
+                  IF (wantDeriv) THEN
+                     IF (Iflbgf(I  ).GT.0) then
+                        val = calcData%getSharedValNs(irow, 1, Iflbgf(I)) + A
+                        call   calcData%setSharedValNs(irow, 1, Iflbgf(I), val)
+                     end if
+                     IF (Iflbgf(I+1).GT.0) then
+                        val = calcData%getSharedValNs(irow, 1, Iflbgf(I+1)) + B
+                        call   calcData%setSharedValNs(irow, 1, Iflbgf(I+1), val)
+                     end if
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.6 .AND. Kndbgf(I+1).EQ.6) THEN
+! ***       point-wise function in Energy
+            IF (Em.GE.Bgfmin(I)) THEN
+               IF (Em.LT.Bgfmin(I+1)) THEN
+                  D = Bgfmin(I+1) - Bgfmin(I)
+                  A = (Bgfmin(I+1)-Em)/D
+                  B = (Em-Bgfmin(I))/D
+                  val = calcData%getSharedValNs(irow, 1, 0) +  A*Parbgf(I) + B*Parbgf(I+1)
+                  call calcData%setSharedValNs(irow, 1, 0, val)
+                  IF (wantDeriv) THEN
+                     IF (Iflbgf(I  ).GT.0)  then
+                        val = calcData%getSharedValNs(irow, 1, Iflbgf(I)) + A
+                        call   calcData%setSharedValNs(irow, 1, Iflbgf(I), val)
+                     end if
+                     IF (Iflbgf(I+1).GT.0) then
+                        val = calcData%getSharedValNs(irow, 1, Iflbgf(I+1)) + B
+                        call   calcData%setSharedValNs(irow, 1, Iflbgf(I+1), val)
+                    end if
+                  END IF
+               END IF
+            END IF
+!
+         ELSE IF (Kndbgf(I).GT.1000 .AND. Kndbgf(I).LE.2000) THEN
+! ***       point-wise function in time, multiplier is variable
+            T = Ttoe/dSQRT(Em)
+            Itefil = Kndbgf(I) - 1000
+            CALL Find_Te (T, Texbgf(1,Itefil), Ntepnt, Nte)
+            IF (Nte.EQ.0) THEN
+               S = Zero
+            ELSE IF (Nte.LT.0) THEN
+               S = Teabgf(-Nte,Itefil)
+               val = calcData%getSharedValNs(irow, 1, 0) + Parbgf(I)*S
+               call calcData%setSharedValNs(irow, 1, 0, val)
+            ELSE
+               D = Texbgf(Nte+1,Itefil) - Texbgf(Nte,Itefil)
+               A = (Texbgf(Nte+1,Itefil)-T)/D
+               B = (T-Texbgf(Nte,Itefil))/D
+               S = A*Teabgf(Nte,Itefil) + B*Teabgf(Nte+1,Itefil)
+            END IF
+            val = calcData%getSharedValNs(irow, 1, 0) + Parbgf(I)*S
+            call calcData%setSharedValNs(irow, 1, 0, val)
+            IF (wantDeriv) THEN
+               IF (Iflbgf(I).GT.0) then
+                  val = calcData%getSharedValNs(irow, 1, Iflbgf(I)) + S
+                  call   calcData%setSharedValNs(irow, 1, Iflbgf(I), val)
+               end if
+            END IF
+!
+         ELSE IF (Kndbgf(I).GT.2000) THEN
+! ***       point-wise function in energy, multiplier is variable
+            Itefil = Kndbgf(I) - 2000
+            CALL Find_Te (Em, Texbgf(1,Itefil), Ntepnt, Nte)
+            IF (Nte.EQ.0) THEN
+               S = Zero
+            ELSE IF (Nte.LT.0) THEN
+               S = Teabgf(-Nte,Itefil)
+               val = calcData%getSharedValNs(irow, 1, 0) + Parbgf(I)*S
+               call calcData%setSharedValNs(irow, 1, 0, val)
+            ELSE
+               D = Texbgf(Nte+1,Itefil) - Texbgf(Nte,Itefil)
+               A = (Texbgf(Nte+1,Itefil)-Em)/D
+               B = (Em-Texbgf(Nte,Itefil))/D
+               S = A*Teabgf(Nte,Itefil) + B*Teabgf(Nte+1,Itefil)
+            END IF
+            val = calcData%getSharedValNs(irow, 1, 0) + Parbgf(I)*S
+            call calcData%setSharedValNs(irow, 1, 0, val)
+            IF (wantDeriv) THEN
+               IF (Iflbgf(I).GT.0) then
+                  val = calcData%getSharedValNs(irow, 1, Iflbgf(I)) + S
+                  call   calcData%setSharedValNs(irow, 1, Iflbgf(I), val)
+               end if
+            END IF
+!
+         ELSE IF (Kndbgf(I).EQ.9) THEN
+! ***       A*E^(-B)
+            IF (Bgfmin(I).EQ.Zero .OR. Em.GE.Bgfmin(I)) THEN
+               IF (Bgfmax(I).EQ.Zero .OR. Em.LT.Bgfmax(I)) THEN
+                  Exx = Em**(-Parbgf(I+1))
+                  sig = calcData%getSharedValNs(irow, 1, 0) +  Parbgf(I)*Exx
+                  call calcData%setSharedValNs(irow, 1, 0, sig)
+                  IF (wantDeriv) THEN
+                     IF (Iflbgf(I  ).GT.0) then
+                         call   calcData%setSharedValNs(irow, 1, Iflbgf(I  ), Exx)
+                     end if
+                     IF (Iflbgf(I+1).GT.0) then
+                         call   calcData%setSharedValNs(irow, 1,Iflbgf(I+1), - dLOG(Em)*Sig)
+                     end if
+                  END IF
+               END IF
+            END IF
+!
+         END IF
+      END DO
+      RETURN
+      END
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Nnneta (Iflmsc, Sig, Dbsig, Na, Niso)
+!
+! *** Purpose -- Generate derivative with respect to NU
+!
+      use fixedi_m, only : Ndbxxx, Ndasig
+      use ifwrit_m, only : Kjetan
+      use fixedr_m, only : Etanuu
+      IMPLICIT None
+!
+      integer::Na, Niso
+      real(kind=8)::Sig(Na,*), Dbsig(Na,Ndbxxx,*)
+      integer::Iflmsc(*)
+
+      integer::Iso, N
+!
+      IF (Kjetan.LE.0) RETURN
+      IF (Iflmsc(Kjetan).EQ.0) RETURN
+      N = Iflmsc(Kjetan)
+      IF (N.LE.Ndasig) THEN
+         STOP '[STOP in Nnneta in cro/mnrm1.f]'
+      ELSE
+         DO Iso=1,Niso
+            Dbsig(1,N,Iso) = Sig(1,Iso)/Etanuu
+         END DO
+      END IF
+      RETURN
+      END
+!
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Find_Te (T, Tt, Ntepnt, Nte)
+! *** Purpose -- Find position Nte such that Tt(Nte).LE.T.LT.Tt(Nte+1)
+      IMPLICIT None
+      real(kind=8):: Tt(*), T
+      integer::Ntepnt, Nte
+      real(kind=8),parameter::Zero=0.0d0
+      integer::I
+
+      Nte = 0
+      DO I=1,Ntepnt
+         IF (I.GT.1 .AND. Tt(I).EQ.Zero) RETURN
+         IF (T.LT.Tt(I)) THEN
+            Nte = I - 1
+            RETURN
+         ELSE IF (T.EQ.Tt(I)) THEN
+            Nte = - I
+         END IF
+      END DO
+      RETURN
+      END
+end module normalize_and_background
diff --git a/sammy/src/cro/mnrm2.f b/sammy/src/cro/mnrm2.f
deleted file mode 100755
index 89069e0959098b524e1eedb541fd80a6d0c54475..0000000000000000000000000000000000000000
--- a/sammy/src/cro/mnrm2.f
+++ /dev/null
@@ -1,152 +0,0 @@
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Transm (Sig, Dasig, Dbsig, Jjtrns, Kkkthc, Ttthck)
-C
-C *** Purpose -- Transform from total cross section to transmission.
-C ***            Note that this routine is called only if summation
-C ***            over isotopes has already occurred.
-C
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Sig(*), Dasig(Nnnsig,*), Dbsig(Nnnsig,*)
-      DATA Zero /0.0d0/
-C
-      Xxx = dEXP(-Sig(Jjtrns)*Ttthck)
-C
-      IF (Ksolve.NE.2) THEN
-         A = -Ttthck*Xxx
-C
-C ***    modify the derivatives to be in terms of transmission
-         N = Jjtrns
-         IF (Ndasig.GT.0) THEN
-            DO Ipar=1,Ndasig
-               IF (Dasig(N,Ipar).NE.Zero) Dasig(N,Ipar) =A*Dasig(N,Ipar)
-            END DO
-         END IF
-         IF (Ndbsig.GT.0) THEN
-            DO Ipar=1,Ndbsig
-               IF (Dbsig(N,Ipar).NE.Zero) Dbsig(N,Ipar) =A*Dbsig(N,Ipar)
-            END DO
-         END IF
-C
-         IF (Kkkthc.GT.0) THEN
-C ***       generate derivative wrt thickness
-            Ipar = Kkkthc
-            IF (Ipar.LE.Ndasig) THEN
-               WRITE (6,10000) Ipar, Ndasig, Kkkthc, 0
-10000          FORMAT ('In Transm, Ipar,Ndasig=', 10I5)
-               STOP '[STOP in Transm in cro/mnrm2.f]'
-            ELSE
-               X = - Sig(Jjtrns)*Xxx
-               Dbsig(N,Ipar-Ndasig) = X
-            END IF
-         END IF
-C
-      END IF
-C *** modify cross section to be transmission
-      Sig(Jjtrns) = Xxx
-      RETURN
-      END
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Trans_Non (Anonu, Bnonu, Rnonu, Znonu, Sig, Dasig,
-     *   Dbsig, Jjtrns, Kkkthc)
-C
-C *** Purpose -- Transform from total cross section to transmission,
-C ***            in the case where sample thickness is not uniform.
-C
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use abcexp_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Anonu(*), Bnonu(*), Rnonu(*), Znonu(*)
-      DIMENSION Sig(*), Dasig(Nnnsig,*), Dbsig(Nnnsig,*)
-      DATA Zero /0.0d0/, One/1.0d0/, Two /2.0d0/, Small /0.3d0/
-C
-      Total = Sig(Jjtrns)*Thick
-      R2 = Rnonu(1)
-      Z2 = Znonu(1)
-      E2 = dEXP(-Total*Z2)
-      Q = Zero
-      dQ = Zero
-      DO I=2,Nonu
-         E1 = E2
-         R1 = R2
-         Z1 = Z2
-         A2 = Anonu(I)
-         B2 = Bnonu(I)
-         R2 = Rnonu(I)
-         C2 = B2*R2
-         C1 = B2*R1
-         Z2 = Znonu(I)
-         E2 = dEXP(-Total*Z2)
-         Dd = Total*(C2-C1)
-         IF (dABS(Dd).GT.Small) THEN
-            A = E1*(Total*C1+One) - E2*(Total*C2+One)
-            F = (Total*B2)**2
-            Q = Q + A/F
-            IF (Ksolve.NE.2) THEN
-               A = One + Total*Z1
-               B = Total*C1*A + One + A
-               C = E1*B
-               A = One + Total*Z2
-               B = Total*C2*A + One + A
-               C = E2*B - C
-               dQ = dQ + C/F
-            END IF
-         ELSE
-            R = R2 - R1
-            F = Abcexp (Dd, Aa, Bb, Cc, Ddd, Ijklmn)
-            A = R*(R1*Aa+R*Bb)
-            Q = Q + A*E2
-            IF (Ksolve.NE.2) THEN
-               A = Aa*(Two+Total*Z1)*R1 + Bb*(Two+Total*A2)*R
-               A = R2**2 - R1**2 - R*A
-               dQ = dQ + A*E2
-            END IF
-         END IF
-      END DO
-      Fix = Rnonu(Nonu)**2/Two
-      X = dQ/Fix
-      Deriv = X/Sig(Jjtrns)
-      X = X/Thick
-      Sig(Jjtrns) = Q/Fix
-C
-      IF (Ksolve.NE.2) THEN
-         A = Deriv
-C
-C ***    Modify the derivatives to be in terms of transmission
-         N = Jjtrns
-         IF (Ndasig.GT.0) THEN
-            DO Ipar=1,Ndasig
-               IF (Dasig(N,Ipar).NE.Zero) Dasig(N,Ipar) =A*Dasig(N,Ipar)
-            END DO
-         END IF
-         IF (Ndbsig.GT.0) THEN
-            DO Ipar=1,Ndbsig
-               IF (Dbsig(N,Ipar).NE.Zero) Dbsig(N,Ipar) =A*Dbsig(N,Ipar)
-            END DO
-         END IF
-C
-         IF (Kkkthc.GT.0) THEN
-C ***       Generate derivative wrt thickness
-            Ipar = Kkkthc
-            IF (Ipar.LE.Ndasig) THEN
-               WRITE (6,10000) Ipar, Ndasig, Kkkthc, 0
-10000          FORMAT ('In Transm, Ipar,Ndasig=', 10I5)
-               STOP '[STOP in Transm in cro/mnrm2.f]'
-            ELSE
-               Dbsig(N,Ipar-Ndasig) = X
-            END IF
-         END IF
-C
-      END IF
-      RETURN
-      END
diff --git a/sammy/src/cro/mnrm2.f90 b/sammy/src/cro/mnrm2.f90
new file mode 100755
index 0000000000000000000000000000000000000000..18a98d021335fa83ae4c078bc582b8bc69254a17
--- /dev/null
+++ b/sammy/src/cro/mnrm2.f90
@@ -0,0 +1,300 @@
+module convert_to_transmission_m
+contains
+!
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Transm (Sig, Dasig, Dbsig, Jjtrns, Kkkthc, Ttthck)
+!
+! *** Purpose -- Transform from total cross section to transmission.
+! ***            Note that this routine is called only if summation
+! ***            over isotopes has already occurred.
+!
+      use fixedi_m, only : Ndbsig,Ndasig,Nnnsig
+      use ifwrit_m, only : Ksolve
+      IMPLICIT None
+      real(kind=8)::Sig(*), Dasig(Nnnsig,*), Dbsig(Nnnsig,*)
+      integer::Jjtrns, Kkkthc
+      real(kind=8)::Ttthck
+      real(kind=8)::Zero
+      real(kind=8)::Xxx, X, A
+      integer::N, Ipar
+      DATA Zero /0.0d0/
+!
+      Xxx = dEXP(-Sig(Jjtrns)*Ttthck)
+!
+      IF (Ksolve.NE.2) THEN
+         A = -Ttthck*Xxx
+!
+! ***    modify the derivatives to be in terms of transmission
+         N = Jjtrns
+         IF (Ndasig.GT.0) THEN
+            DO Ipar=1,Ndasig
+               IF (Dasig(N,Ipar).NE.Zero) Dasig(N,Ipar) =A*Dasig(N,Ipar)
+            END DO
+         END IF
+         IF (Ndbsig.GT.0) THEN
+            DO Ipar=1,Ndbsig
+               IF (Dbsig(N,Ipar).NE.Zero) Dbsig(N,Ipar) =A*Dbsig(N,Ipar)
+            END DO
+         END IF
+!
+         IF (Kkkthc.GT.0) THEN
+! ***       generate derivative wrt thickness
+            Ipar = Kkkthc
+            IF (Ipar.LE.Ndasig) THEN
+               WRITE (6,10000) Ipar, Ndasig, Kkkthc, 0
+10000          FORMAT ('In Transm, Ipar,Ndasig=', 10I5)
+               STOP '[STOP in Transm in cro/mnrm2.f]'
+            ELSE
+               X = - Sig(Jjtrns)*Xxx
+               Dbsig(N,Ipar-Ndasig) = X
+            END IF
+         END IF
+!
+      END IF
+! *** modify cross section to be transmission
+      Sig(Jjtrns) = Xxx
+      RETURN
+      END
+
+      SUBROUTINE Transm_new (calcData, irow, isig,  itot,  wantDerivs, Kkkthc, Ttthck)
+!
+! *** Purpose -- Transform from total cross section to transmission.
+! ***            Note that this routine is called only if summation
+! ***            over isotopes has already occurred.
+!
+      use DerivativeHandler_M
+      IMPLICIT None
+      class(DerivativeHandler)::calcData
+      integer::Jjtrns, Kkkthc
+      real(kind=8)::Ttthck
+      real(kind=8)::Zero
+      logical::wantDerivs
+      real(kind=8)::Xxx, X, A, sig
+      integer::N, Ipar, itot, irow, isig
+      DATA Zero /0.0d0/
+!
+      sig =  calcData%getSharedValNs(irow, isig, 0)
+      Xxx = dEXP(-sig*Ttthck)
+! *** modify cross section to be transmission
+      call calcData%setSharedValNs(irow, isig, 0, Xxx)
+      if(  .not.wantDerivs) return
+
+      A = -Ttthck*Xxx
+      DO Ipar=1,itot
+          X  = calcData%getSharedValNs(irow, isig, ipar)
+          if (X.ne.0.0d0) then
+             X = A * X
+             call calcData%setSharedValNs(irow, isig, ipar, X)
+          end if
+       end do
+!
+       IF (Kkkthc.GT.0) THEN
+! ***       generate derivative wrt thickness
+          Ipar = Kkkthc
+          X = - sig*Xxx
+          call calcData%setSharedValNs(irow, isig, Ipar, X)
+      END IF
+      RETURN
+      END
+!
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Trans_Non (Anonu, Bnonu, Rnonu, Znonu, Sig, Dasig, &
+         Dbsig, Jjtrns, Kkkthc)
+!
+! *** Purpose -- Transform from total cross section to transmission,
+! ***            in the case where sample thickness is not uniform.
+!
+      use fixedi_m
+      use ifwrit_m
+      use fixedr_m
+      use abcexp_m
+      IMPLICIT None
+      real(kind=8)::Anonu(*), Bnonu(*), Rnonu(*), Znonu(*)
+      real(kind=8)::Sig(*), Dasig(Nnnsig,*), Dbsig(Nnnsig,*)
+      real(kind=8)::Zero, One, Two, Small
+      integer::Jjtrns, Kkkthc
+      real(kind=8)::A, A2, F, Aa, B, B2, Bb, C, Cc, C1, C2, Dd
+      real(kind=8)::Ddd, Deriv, dQ, E1, E2, Fix
+      integer::Ipar, N, I, Ijklmn
+      real(kind=8)::Q, R, R1, R2, Total, X, Z1, Z2
+      DATA Zero /0.0d0/, One/1.0d0/, Two /2.0d0/, Small /0.3d0/
+!
+      Total = Sig(Jjtrns)*Thick
+      R2 = Rnonu(1)
+      Z2 = Znonu(1)
+      E2 = dEXP(-Total*Z2)
+      Q = Zero
+      dQ = Zero
+      DO I=2,Nonu
+         E1 = E2
+         R1 = R2
+         Z1 = Z2
+         A2 = Anonu(I)
+         B2 = Bnonu(I)
+         R2 = Rnonu(I)
+         C2 = B2*R2
+         C1 = B2*R1
+         Z2 = Znonu(I)
+         E2 = dEXP(-Total*Z2)
+         Dd = Total*(C2-C1)
+         IF (dABS(Dd).GT.Small) THEN
+            A = E1*(Total*C1+One) - E2*(Total*C2+One)
+            F = (Total*B2)**2
+            Q = Q + A/F
+            IF (Ksolve.NE.2) THEN
+               A = One + Total*Z1
+               B = Total*C1*A + One + A
+               C = E1*B
+               A = One + Total*Z2
+               B = Total*C2*A + One + A
+               C = E2*B - C
+               dQ = dQ + C/F
+            END IF
+         ELSE
+            R = R2 - R1
+            F = Abcexp (Dd, Aa, Bb, Cc, Ddd, Ijklmn)
+            A = R*(R1*Aa+R*Bb)
+            Q = Q + A*E2
+            IF (Ksolve.NE.2) THEN
+               A = Aa*(Two+Total*Z1)*R1 + Bb*(Two+Total*A2)*R
+               A = R2**2 - R1**2 - R*A
+               dQ = dQ + A*E2
+            END IF
+         END IF
+      END DO
+      Fix = Rnonu(Nonu)**2/Two
+      X = dQ/Fix
+      Deriv = X/Sig(Jjtrns)
+      X = X/Thick
+      Sig(Jjtrns) = Q/Fix
+!
+      IF (Ksolve.NE.2) THEN
+         A = Deriv
+!
+! ***    Modify the derivatives to be in terms of transmission
+         N = Jjtrns
+         IF (Ndasig.GT.0) THEN
+            DO Ipar=1,Ndasig
+               IF (Dasig(N,Ipar).NE.Zero) Dasig(N,Ipar) =A*Dasig(N,Ipar)
+            END DO
+         END IF
+         IF (Ndbsig.GT.0) THEN
+            DO Ipar=1,Ndbsig
+               IF (Dbsig(N,Ipar).NE.Zero) Dbsig(N,Ipar) =A*Dbsig(N,Ipar)
+            END DO
+         END IF
+!
+         IF (Kkkthc.GT.0) THEN
+! ***       Generate derivative wrt thickness
+            Ipar = Kkkthc
+            IF (Ipar.LE.Ndasig) THEN
+               WRITE (6,10000) Ipar, Ndasig, Kkkthc, 0
+10000          FORMAT ('In Transm, Ipar,Ndasig=', 10I5)
+               STOP '[STOP in Transm in cro/mnrm2.f]'
+            ELSE
+               Dbsig(N,Ipar-Ndasig) = X
+            END IF
+         END IF
+!
+      END IF
+      RETURN
+      END
+      SUBROUTINE Trans_Non_new (calcData, irow, isig,  itot,  wantDerivs,  &
+                                Anonu, Bnonu, Rnonu, Znonu,  Kkkthc,       &
+                                Nonu, Thick )
+!
+! *** Purpose -- Transform from total cross section to transmission,
+! ***            in the case where sample thickness is not uniform.
+!
+      use abcexp_m
+      use DerivativeHandler_M
+      IMPLICIT None
+      type(DerivativeHandler)::calcData
+      integer::irow, isig,  itot
+      logical::wantDerivs
+      real(kind=8)::Anonu(*), Bnonu(*), Rnonu(*), Znonu(*)
+      real(kind=8)::Zero, One, Two, Small, Thick
+      integer::Kkkthc, Nonu
+      real(kind=8)::A, A2, F, Aa, B, B2, Bb, C, Cc, C1, C2, Dd
+      real(kind=8)::Ddd, Deriv, dQ, E1, E2, Fix, Sig, val
+      integer::Ipar, N, I, Ijklmn
+      real(kind=8)::Q, R, R1, R2, Total, X, Z1, Z2
+      DATA Zero /0.0d0/, One/1.0d0/, Two /2.0d0/, Small /0.3d0/
+!
+      Sig = calcData%getSharedValNs(irow, Isig, 0)
+      Total = Sig *Thick
+      R2 = Rnonu(1)
+      Z2 = Znonu(1)
+      E2 = dEXP(-Total*Z2)
+      Q = Zero
+      dQ = Zero
+      DO I=2,Nonu
+         E1 = E2
+         R1 = R2
+         Z1 = Z2
+         A2 = Anonu(I)
+         B2 = Bnonu(I)
+         R2 = Rnonu(I)
+         C2 = B2*R2
+         C1 = B2*R1
+         Z2 = Znonu(I)
+         E2 = dEXP(-Total*Z2)
+         Dd = Total*(C2-C1)
+         IF (dABS(Dd).GT.Small) THEN
+            A = E1*(Total*C1+One) - E2*(Total*C2+One)
+            F = (Total*B2)**2
+            Q = Q + A/F
+            IF (wantDerivs) THEN
+               A = One + Total*Z1
+               B = Total*C1*A + One + A
+               C = E1*B
+               A = One + Total*Z2
+               B = Total*C2*A + One + A
+               C = E2*B - C
+               dQ = dQ + C/F
+            END IF
+         ELSE
+            R = R2 - R1
+            F = Abcexp (Dd, Aa, Bb, Cc, Ddd, Ijklmn)
+            A = R*(R1*Aa+R*Bb)
+            Q = Q + A*E2
+            IF (wantDerivs) THEN
+               A = Aa*(Two+Total*Z1)*R1 + Bb*(Two+Total*A2)*R
+               A = R2**2 - R1**2 - R*A
+               dQ = dQ + A*E2
+            END IF
+         END IF
+      END DO
+      Fix = Rnonu(Nonu)**2/Two
+      X = dQ/Fix
+      Deriv = X/Sig
+      X = X/Thick
+      Sig = Q/Fix
+      call calcData%setSharedValNs(irow, isig, 0, Sig)
+!
+      IF (wantDerivs) THEN
+         A = Deriv
+!
+! ***    Modify the derivatives to be in terms of transmission
+         do ipar = 1, itot
+            val = calcData%getSharedValNs(irow, isig, Ipar)
+            if (val.ne.Zero) then
+               val = val * A
+               call calcData%setSharedValNs(irow, Isig, Ipar, val)
+            end if
+         end do
+!
+         IF (Kkkthc.GT.0) THEN
+! ***       Generate derivative wrt thickness
+            Ipar = Kkkthc
+            call calcData%setSharedValNs(irow, Isig, Ipar, X)
+         END IF
+!
+      END IF
+      RETURN
+      END
+end module convert_to_transmission_m
diff --git a/sammy/src/dbd/mdbd1.f b/sammy/src/dbd/mdbd1.f
index 6143406b8faf8740a21567b8d625cdd144e8a67b..3a75fbb0018c214b46ba8e0ac5ff61c023ef9383 100644
--- a/sammy/src/dbd/mdbd1.f
+++ b/sammy/src/dbd/mdbd1.f
@@ -25,6 +25,8 @@ C
      *                          setAuxGridRowMax, getNumAuxGridPoints
       use SammyGridAccess_M
       use array_sizes_common_m, only : calcData
+      use convert_to_transmission_m
+      use normalize_and_background
       IMPLICIT none
       logical Need_isotopes
       logical Another_Process_will_Happen
diff --git a/sammy/src/dbd/mdbd2.f b/sammy/src/dbd/mdbd2.f
index e783281fe5e2265a74f55a7397c084ed34065bae..4cc8d22fc53f7e124866d30b797acf4fc846727a 100644
--- a/sammy/src/dbd/mdbd2.f
+++ b/sammy/src/dbd/mdbd2.f
@@ -116,6 +116,8 @@ C
       use lbro_common_m
       use xct2_m
       use array_sizes_common_m, only : calcData
+      use normalize_and_background
+      use convert_to_transmission_m
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 C
       DIMENSION Parnbk(*), Iflnbk(*), Parbgf(*), Iflbgf(*),
diff --git a/sammy/src/dex/mdex1.f b/sammy/src/dex/mdex1.f
index 0edb58500247cf4f400fb727eea29a65f2459ae1..f3334c99711dbd22e292454f6466a6eff0bfcfc9 100644
--- a/sammy/src/dex/mdex1.f
+++ b/sammy/src/dex/mdex1.f
@@ -24,6 +24,7 @@ C
       use rsl2_m
       use array_sizes_common_m, only : calcData
       use EndfData_common_m, only : expData
+      use normalize_and_background
       use AuxGridHelper_M, only : getAuxGridOffset,
      *                            setAuxGridRowMax,
      *                            getNumAuxGridPoints
@@ -36,7 +37,7 @@ C
      *   Weight(*), Wts(*), Theory(*),
      *   Sigxxx(*), Dasigx(Nnnsig,*),
      *   Dbsigx(Nnnsig,*), Dum(1)
-      real(kind=8)::Iflmsc(*), Iflnbk(*), Iflbgf(*),
+      integer::Iflmsc(*), Iflnbk(*), Iflbgf(*),
      *   Kndbgf(*)
 
       real(kind=8)::Half
diff --git a/sammy/src/dop/mdop1.f90 b/sammy/src/dop/mdop1.f90
index 411b65d7119f671ce6bcdd4bafa11c3fd7f53e4c..eb1396188aae3556c35398c5ab190e5fabd9ac1f 100644
--- a/sammy/src/dop/mdop1.f90
+++ b/sammy/src/dop/mdop1.f90
@@ -1,5 +1,6 @@
 !
 module dop1_m
+  use convert_to_transmission_m
   contains
 !
 ! ____________________________________________________________________
diff --git a/sammy/src/fgm/mfgm1.f b/sammy/src/fgm/mfgm1.f
index e2045d05471deeb84407feb52a8cf3a9442cb91c..5e30e49a4167138673d1a30269b31fe1dac304dc 100644
--- a/sammy/src/fgm/mfgm1.f
+++ b/sammy/src/fgm/mfgm1.f
@@ -75,6 +75,7 @@ C
       use mfgm3_M
       use mfgm4_m
       use EndfData_common_m, only : resParData
+      use convert_to_transmission_m
       IMPLICIT None
       LOGICAL Need_isotopes
       LOGICAL Another_Process_Will_Happen
diff --git a/sammy/src/mlb/mmlb1.f b/sammy/src/mlb/mmlb1.f
index 842afcc0ad8a9d9b97a779ce8aacd7317892100d..e9d13eab7950f13504d5b871cd76a0c75037e0d7 100644
--- a/sammy/src/mlb/mmlb1.f
+++ b/sammy/src/mlb/mmlb1.f
@@ -118,8 +118,6 @@ C *********    If want Maxwellian averages or energy-averages with no
 C *********       correction terms, do same as if there is broadening
 C *********       except don't convert to transmission unless needed
                IF (Maxwel.EQ.1 .OR. Knocor.EQ.1) THEN
-                  IF (Ytrans .AND. Kcros.LT.7 .AND. Ktruet.EQ.0) CALL
-     *               Transm (Sigxxx, Dasigx, Dbsigx, 1, Kvthck, Thick)
                   Iskip = 1
                END IF
 C
@@ -127,9 +125,6 @@ C *********    If there is Doppler broadening, skip the rest of this loop
                IF (Ydoppr) Iskip = 1
 C
 C *********    If no Doppler, and this is transmission, make conversion
-               IF (.NOT.Ydoppr .AND. Ytrans .AND. Kcros.LT.7
-     *             .AND. Ktruet.EQ.0) CALL
-     *            Transm (Sigxxx, Dasigx, Dbsigx, 1, Kvthck, Thick)
 C
 C *********    If there is resolution, we're done here
                IF (Yresol) Iskip = 1
@@ -140,17 +135,8 @@ C
 C
 C *********       If ETA is being calculated and there is no broadening,
 C *********          find derivative with respect to nu
-                  IF (Kcros.EQ.6) CALL Fix_Eta (Iflmsc, Sigxxx, Dasigx,
-     *                  Dbsigx)
 C
 C *********       If there is normalization or background ...
-                  IF (Ynrmbk) THEN
-                     IF (Numnbk.GT.0) CALL Norm (Parnbk, Iflnbk,
-     *                  Sigxxx, Dasigx, Dbsigx, Su, Nnnsig)
-                     IF (Numbgf.GT.0) CALL Bgfrpi (Parbgf, Iflbgf,
-     *                  Kndbgf, Bgfmin, Bgfmax, Texbgf, Teabgf, Sigxxx,
-     *                  Dbsigx, Su, Nnnsig)
-                  END IF
 C
 C *********       Write results onto Theory if there is no broadening etc
                   IF (Jjjdop.NE.1) THEN
@@ -179,11 +165,6 @@ C
       END DO
 C *** End of do-loop on energies
 C
-      IF (Ywhich .OR. Maxwel.EQ.1 .OR. Knocor.EQ.1) THEN
-         Kkkmin = Kkkmin - 1
-         CALL Write_Cross_Sections (calcData,
-     *         Nnnsig, Kkkkkk, Kkkmin, 0)
-      END IF
 C
       IF (Kpiece.EQ.1) CALL Odfpcs (Pieces, Dum)
 C
diff --git a/sammy/src/mso/mmso2.f b/sammy/src/mso/mmso2.f
index b3b2b8993d32f36b08fbffae1a5a46c9d3ae1d55..1e33b9122b5a948b5749a6e540dcdfe850c46d8e 100644
--- a/sammy/src/mso/mmso2.f
+++ b/sammy/src/mso/mmso2.f
@@ -38,6 +38,7 @@ C
       use SammyGridAccess_M
       use ssssss_common_m, only :  Area, Rb, Rs, Sthick, Dthick, Fffdbl
       use array_sizes_common_m, only : calcData
+      use normalize_and_background
       IMPLICIT None
       LOGICAL Another_Process_will_Happen
 C
@@ -67,10 +68,11 @@ C
       real(kind=8)::Asensn,Dddyy0, Ee, Elastic, Em, Exp1
       real(kind=8)::R0, Ratio_Sensin, Rd, Total, Y0, Y2bbbb, Y2bbbq
       real(kind=8)::Yyy1, Yyy2, Yyy2q
-      integer::Idone, Iflbgf, Nnnxxx, Nsen, Nxtptvn, Nxtptwm
+      integer::Idone, Nnnxxx, Nsen, Nxtptvn, Nxtptwm
       integer::Iiso, Imin, Iso, Istop, Itimes, Iv, Iw
       integer::Kdatmn, Kdatmx, Kk, Kkkdat, Kkkmin, Kkknew, nauxStart
       integer::Knthet, Kountr, ksolve_save, N, Nn, Nnn
+      integer::Iflbgf(1)   ! DAW: why is this not passed in?
       DATA Zero /0.0d0/, One /1.0d0/
 
       call grid%initialize()
diff --git a/sammy/src/orr/morr1.f90 b/sammy/src/orr/morr1.f90
index fee38a24ea7d9875ff9add8aba7b3ef4cfbc099c..511c63e3db5fdca34c6b2273d5074f7fe1aea283 100644
--- a/sammy/src/orr/morr1.f90
+++ b/sammy/src/orr/morr1.f90
@@ -26,6 +26,7 @@ module orr1_m
       use rsl6_m     
       use AllocateFunctions_m
       use DerivativeHandler_M
+      use normalize_and_background
 !
       type(SammyGridAccess)::expGrid
       real(kind=8):: Parnbk(*), Parbgf(*), Bgfmin(*), Bgfmax(*),       &
diff --git a/sammy/src/rpi/mrpi1.f90 b/sammy/src/rpi/mrpi1.f90
index 3496ec203c5e6fe5d5abe89f4e57721354991c0c..2ea03d9c596db2f9f8bb5f1444023ee15b2cbb71 100644
--- a/sammy/src/rpi/mrpi1.f90
+++ b/sammy/src/rpi/mrpi1.f90
@@ -28,6 +28,7 @@ module rpi1_m
       use rsl2_m
       use rsl3_m
       use rsl6_m
+      use normalize_and_background
       use EndfData_common_m, only : expData
       use AuxGridHelper_M, only : getNumAuxGridPoints
       use SammyGridAccess_M
diff --git a/sammy/src/rsl/mrsl1.f90 b/sammy/src/rsl/mrsl1.f90
index 0f85289cc349a922386c2adb19fb616899d50f7d..dbd772ab3cdd413d7f24002389f1193b1393ca30 100644
--- a/sammy/src/rsl/mrsl1.f90
+++ b/sammy/src/rsl/mrsl1.f90
@@ -31,6 +31,7 @@ module rsl1_m
       use rsl6_m, only : Kount_Points
       use SammyGridAccess_M
       use DerivativeHandler_M
+      use normalize_and_background
       use EndfData_common_m, only : expData
       use AuxGridHelper_M, only :   getAuxGridOffset, setAuxGridRowMax,  &
                                     getNumAuxGridPoints
diff --git a/sammy/src/sammy/CMakeLists.txt b/sammy/src/sammy/CMakeLists.txt
index f10f89e2507f550ba2f00e667dcc30888e167c4f..d4e228547fdea32c4f658395f497bb4610c020fd 100644
--- a/sammy/src/sammy/CMakeLists.txt
+++ b/sammy/src/sammy/CMakeLists.txt
@@ -76,8 +76,8 @@ APPEND_SET(SAMMY_SOURCES
             ../cro/mcro6.f
             ../cro/mcro7.f
             ../cro/mcro8.f
-            ../cro/mnrm1.f
-            ../cro/mnrm2.f
+            ../cro/mnrm1.f90
+            ../cro/mnrm2.f90
             ../cro/CroCrossCalc_M.f90
 
             ../dat/mdat0.f90
diff --git a/sammy/src/ssm/mssm22.f90 b/sammy/src/ssm/mssm22.f90
index dacb4de6521ccfb243f8a06e8e9767180fcafb8e..682923ebcd10c8ff022526ba2df8fe6ce905d73a 100644
--- a/sammy/src/ssm/mssm22.f90
+++ b/sammy/src/ssm/mssm22.f90
@@ -13,6 +13,7 @@ use fixedr_m
 use logic_ssm_common_m
 use lbro_common_m
 use DerivativeHandler_M
+use normalize_and_background
 IMPLICIT none
 
 real(8), intent(in):: Ee, Em, Y0
diff --git a/sammy/src/the/ZeroKCrossCorrections_M.f90 b/sammy/src/the/ZeroKCrossCorrections_M.f90
index 53705908cdfae38c96b418e923d779db4a00152a..c68da6af74dec1464e7f89cf925588253c1612cf 100644
--- a/sammy/src/the/ZeroKCrossCorrections_M.f90
+++ b/sammy/src/the/ZeroKCrossCorrections_M.f90
@@ -88,44 +88,259 @@ contains
   end subroutine
 
   subroutine ZeroKCrossCorrections_writeMCData(this)
+     use mxct27_m, only : Write_Cross_Sections  ! this function uses SAMMY global parameters
      class(ZeroKCrossCorrections)::this
 
+     integer::If_W_Selfin
+     integer::Kkkkkk, Kkkmin, Nnnsss, length
+
+
+     if (.not.this%moreCorrections) return  ! don't need to write the data
+     Kkkkkk = this%dataEnd
+     Kkkmin = this%dataStart - 1
+     if (Kkkmin.lt.0) Kkkmin = 0
+     Nnnsss = this%driver%calcData%getNnnsig()
+
+    If_W_Selfin = 0
+    length = this%dataEnd - this%dataStart
+    if (this%driver%calcDataSelf%getLength().ge.length) If_W_Selfin = 1
+
+     call  Write_Cross_Sections (this%driver%calcData,                &
+                                 Nnnsss, Kkkkkk, Kkkmin,               &
+                                 If_W_Selfin, this%driver%calcDataSelf)
+
   end subroutine
 
   subroutine ZeroKCrossCorrections_setTheory(this, Theory, nnsig)
       class(ZeroKCrossCorrections)::this
       integer::nnsig
       real(kind=8)::Theory(nnsig,*)
+      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 (nnsig.ne.this%driver%calcData%getNnnsig()) then
+          write(0,*)" Number of cross sections do not agree "
+          stop
+      end if
+      do id = 1, this%dataStart -1
+         do is = 1, nnsig
+            Theory(is, id) = 0.0d0
+         end do
+      end do
+      do id = this%dataStart, this%dataEnd
+         do is = 1, nnsig
+            Theory(is, id) =  this%driver%calcData%getDataNs(id, is, 0, 1)
+         end do
+      end do
   end subroutine
 
   subroutine ZeroKCrossCorrections_applyNorm(this, grid, expData, covariance)
+     use lbro_common_m, only : Ynrmbk
+     use fixedi_m, only : Numnbk, Numbgf
      use ifwrit_m, only : Ksolve
      use CovarianceData_M
+     use normalize_and_background
+     use exploc_common_m, only : A_Iprnbk, I_Iflnbk, A_Iprbgf, I_Iflbgf, I_Indbgf, &
+                                 A_Ibgfmi, A_Ibgfma, A_Itexbg , A_Iteabg
+
      use GridData_M
      class(ZeroKCrossCorrections)::this
      type(SammyGridAccess)::grid
      type(GridDataList)::expData
      type(CovarianceData)::covariance
+
+     integer::numEl
+     integer::ipos, iel, itot, in
+     real(kind=8)::ener
+
+     logical::wantDeriv
+
+
+     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
+
+     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
+           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
+              end do
+           end if
+        end if
+     end if
+     itot = 0
+     if (wantDeriv) 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 (Numnbk.gt.0) then
+              CALL Norm_new (A_Iprnbk , I_Iflnbk, ener, ipos, this%driver%calcData, wantDeriv, itot)
+         end if
+         IF (Numbgf.GT.0) then
+            CALL Bgfrpi_new (A_Iprbgf, I_Iflbgf, I_Indbgf, A_Ibgfmi, A_Ibgfma, &
+                             A_Itexbg, A_Iteabg,                               &
+                             ener, this%driver%calcData, ipos, wantDeriv)
+         end if
+     end do
   end subroutine
 
+
   subroutine ZeroKCrossCorrections_convertToTrans(this,  grid, expData, covariance)
       use CovarianceData_M
       use GridData_M
+      use convert_to_transmission_m
+      use exploc_common_m, only :  A_Ianonu, A_Ibnonu, A_Irnonu, A_Iznonu
+      use ifwrit_m, only : Ksolve, Nonu, Kvthck
+      use fixedr_m, only : Thick
       class(ZeroKCrossCorrections)::this
       type(SammyGridAccess)::grid
       type(GridDataList)::expData
       type(CovarianceData)::covariance
 
+      integer::iel, numEl, itot, ipos
+      real(kind=8)::ener
+      logical::wantDeriv
+
+      if (.not.this%wantTrans) return  ! don't need to do transformation to transmission yet
+
+      numEl = grid%getNumEnergies(expData)
+      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
+      itot = 0
+      if (wantDeriv) 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 (Nonu.EQ.0) THEN
+            CALL Transm_new (this%driver%calcData, ipos, 1, itot, wantDeriv, Kvthck, Thick)
+         ELSE
+            CALL Trans_Non_new (this%driver%calcData, ipos, 1,itot,  wantDeriv,   &
+                                A_Ianonu , A_Ibnonu , A_Irnonu , A_Iznonu ,       &
+                                Kvthck, Nonu, Thick)
+         END IF
+      end do
   end subroutine
 
   subroutine ZeroKCrossCorrections_Fix_Eta(this,  grid, expData, covariance)
       use CovarianceData_M
       use GridData_M
+      use exploc_common_m, only :  I_Iflmsc
+      use ifwrit_m, only : Ksolve, Kjetan
+      use fixedr_m, only : Etanuu
       class(ZeroKCrossCorrections)::this
       type(SammyGridAccess)::grid
       type(GridDataList)::expData
       type(CovarianceData)::covariance
 
+      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
+
+
+
+      numEl = grid%getNumEnergies(expData)
+      ipos  = 0
+      itot = 0
+      niso = this%driver%calcData%getNumberIsotopes()
+
+      if (this%driver%calcData%getNnnsig().lt.2) then
+         write(0,*)" 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()
+
+      do iel = 1, numEl
+         ener = grid%getEnergy(iel, expData)
+         if (ener.lt.0.0d0.and..not.this%wantNeg) cycle
+         ipos = ipos + 1
+
+         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
+            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
+            end do
+
+            if (wantDeriv.and.iflKjetan.gt.0) then
+               v1 = Sigma/Etanuu
+               call this%driver%calcData%addDataNs(ipos, 1, iflKjetan, is, v1)
+            end if
+         end do
+     end do
   end subroutine
 
 
diff --git a/sammy/src/udr/mudr1.f b/sammy/src/udr/mudr1.f
index f014f825545032098a95bbae7341ac3d6931de5a..f4f73ced0af1edf82f772d721a1f518537bcd65d 100644
--- a/sammy/src/udr/mudr1.f
+++ b/sammy/src/udr/mudr1.f
@@ -14,7 +14,7 @@ C ***            AND DERIVATIVES
 C
       use fixedi_m, only : Nudeng, Nudtim, Nnnsig, Ndasig, Ndbsig,
      *                     Ndaxxx, Ndbxxx, Nnniso, Numbgf, Numbgf,
-     *                     Numnbk, Nudwhi, numcro
+     *                     Numnbk, Nudwhi, numcro, Ntepnt
       use ifwrit_m, only : ktzero, Jjjdop, Kdebug
       use brdd_common_m, only : Ipk, Ipnts, Kc, Iup
       use lbro_common_m, only : Ynrmbk, Ytotrs
@@ -25,6 +25,7 @@ C
       use AuxGridHelper_M, only : getNumAuxGridPoints
       use SammyGridAccess_M
       use array_sizes_common_m, only : calcData
+      use normalize_and_background
       IMPLICIT None
 C
       type(SammyGridAccess)::grid
@@ -40,7 +41,7 @@ C
      *   UdR_E(Nudtim,*), UdT_E(Nudtim,*), UdR_x(*),
      *   UdT_x(*), Dum_R(*), Dum_t(*)
       integer::Nud_E(*), Nud_t(*), Ieb_x(*)
-      real(kind=8)::Texbgf, Teabgf
+      real(kind=8)::Texbgf(Ntepnt,*), Teabgf(Ntepnt,*)
 
       real(kind=8)::Elow, Em, Eup
       integer::I, Ienpk, Igbpk, Itime, J, Jcro, nauxMax
diff --git a/sammy/src/xct/mxct02.f90 b/sammy/src/xct/mxct02.f90
index 96969d90f0cd51f49125c180c6af38a64bc3fbd3..c22f55d6a40c2f543c54f7067601b41b8ef5e11d 100644
--- a/sammy/src/xct/mxct02.f90
+++ b/sammy/src/xct/mxct02.f90
@@ -226,15 +226,6 @@ module xct2_m
 ! *********    correction terms, do same as if there were broadening
 ! *********    except don't convert to transmission unless needed
             IF (Maxwel.EQ.1 .OR. Knocor.EQ.1) THEN
-               IF (Ytrans .AND. Kcros.LT.7 .AND. Ktruet.EQ.0) THEN
-                  IF (Nonu.EQ.0) THEN
-                     CALL Transm (Sigxxx, Dasigx, Dbsigx, 1, Kvthck, &
-                        Thick)
-                  ELSE
-                     CALL Ztrans (Sigxxx, Dasigx, Dbsigx, 1, &
-                        Kvthck)
-                  END IF
-               END IF
                Iskip = 1
             END IF
 !
@@ -250,9 +241,6 @@ module xct2_m
             IF (Yssmsc) Iskip = 1
 !
 ! ********* If no Doppler, and this is transmission, make conversion
-            IF (.NOT.Ydoppr .AND. Ytrans .AND. Kcros.LT.7 &
-                .AND. Ktruet.EQ.0) CALL &
-               Transm (Sigxxx, Dasigx, Dbsigx, 1, Kvthck, Thick)
 !
 ! ********* If there is resolution, we're done here.
             IF (Yresol) Iskip = 1
@@ -267,13 +255,6 @@ module xct2_m
 !x     *            Nnnsig, Nnniso)
 !
 ! *********    If there is normalization or background, include it
-               IF (Ynrmbk) THEN
-                  IF (Numnbk.GT.0) CALL Norm (Parnbk, Ifl_Nbk, &
-                     Sigxxx, Dasigx, Dbsigx, Su, Nnnsig)
-                  IF (Numbgf.GT.0) CALL Bgfrpi (Parbgf, Ifl_bgf, &
-                     Kndbgf, Bgfmin, Bgfmax, Texbgf, Teabgf, &
-                     Sigxxx, Dbsigx, Su, Nnnsig)
-               END IF
 !
 ! *********    write results onto theory if there is no broadening etc
                IF (Jjjdop.NE.1) THEN
@@ -299,12 +280,6 @@ module xct2_m
                    end do
                   call derivs%addCalculatedData(Kkkkkk, Nnnsig, ndasig, &
                           ndbsig, -1, Sigxxx(1:Nnnsig,1), Dasigx, Dbsigx(1:Nnnsig,1:Ndbxxx,1))
-                  do Jsig = 1,Nnnsig
-                     Jcount = (Kkkkkk-1)*Nnnsig + Jsig
-                     ! get the cross section (Ipar=0 in Derivs) for section Nnsig
-                     ! and isotope 1
-                     Theory(Jsig,Jjdat) =  derivs%getData(Jcount, 0, 1)
-                  end do
                END IF
 !
             ELSE IF (Iskip.EQ.1) THEN
@@ -351,11 +326,6 @@ module xct2_m
 
 ! *** end of do-loop on energies (Jdat)
 !
-      IF (Ywhich .OR. Maxwel.EQ.1 .OR. Knocor.EQ.1) THEN
-         Kkkmin = Kkkmin - 1
-         CALL Write_Cross_Sections (derivs, &
-                  Nnnsig, numEl, Kkkmin, Iw, derivsSelf)
-      END IF
 !
       IF (Kpiece.EQ.1) CALL Odfpcs (Pieces, Dum)
       call grid%destroy()
@@ -634,6 +604,7 @@ module xct2_m
 ! ***            sample
       use oops_common_m
       use exploc_common_m
+      use convert_to_transmission_m
       IMPLICIT none
 
       real(8), intent(inout)::Sig