diff --git a/sammy/src/clm/CrystalLatticeBroadening_M.f90 b/sammy/src/clm/CrystalLatticeBroadening_M.f90
new file mode 100644
index 0000000000000000000000000000000000000000..ed0d5757cefc97bbe63f7f319f86c21b991e3299
--- /dev/null
+++ b/sammy/src/clm/CrystalLatticeBroadening_M.f90
@@ -0,0 +1,49 @@
+module CrystalLatticeBroadening_M
+use FreeGasDopplerBroadening_M
+use DopplerBroadening_M
+use DerivativeHandler_M
+use GridData_M
+use, intrinsic :: ISO_C_BINDING
+
+
+implicit none
+
+type, extends(FreeGasDopplerBroadening) :: CrystalLatticeBroadening
+contains
+procedure, pass(this) :: initialize => CrystalLatticeBroadening_initialize
+procedure, pass(this) :: broaden => CrystalLatticeBroadening_broaden
+procedure, pass(this) :: destroy => CrystalLatticeBroadening_destroy
+end type CrystalLatticeBroadening
+
+contains
+subroutine CrystalLatticeBroadening_initialize(this, hand, list, work)
+    implicit none
+    class(CrystalLatticeBroadening) :: this
+    class(DerivativeHandler)::hand
+    class(GridDataList)::list
+    class(GridDataList)::work
+    call FreeGasDopplerBroadening_initialize(this, hand, list, work)
+end subroutine
+
+subroutine CrystalLatticeBroadening_destroy(this)
+    implicit none
+    class(CrystalLatticeBroadening) :: this
+    call FreeGasDopplerBroadening_destroy(this)
+end subroutine
+
+
+
+subroutine CrystalLatticeBroadening_broaden(this)
+   class(CrystalLatticeBroadening) :: this
+
+   integer::ndatb
+   type(DerivativeHandler)::data
+
+   ! reserve the data
+   ndatb =  this%getNumEnergyBroadened()
+   call this%getData(data)
+   call data%nullify()
+   call data%reserve(ndatb*data%getNnnsig(), this%numPar+1)
+end subroutine
+
+end module CrystalLatticeBroadening_M
diff --git a/sammy/src/cro/mcro5.f90 b/sammy/src/cro/mcro5.f90
index 831388cbadfc114108dffa29dd377e4a5056fc5f..afa5c3abac0ae59c79f5d52f41d7b0a985943dc4 100644
--- a/sammy/src/cro/mcro5.f90
+++ b/sammy/src/cro/mcro5.f90
@@ -5,6 +5,9 @@ contains
    use DopplerAndResolutionBroadener_M
    use SumIsoAndConvertToTrans_M
    use array_sizes_common_m, only : calcData, calcDataSelf
+   use normalize_and_background, only : Nnneta
+   use broad_common_m, only :  dopplerOption
+   use exploc_common_m, only : I_Iflmsc
    use ifwrit_m, only : Kcros
    use fixedi_m, only : numUsedPar
    use, intrinsic :: ISO_C_BINDING
@@ -14,10 +17,12 @@ contains
    class(DopplerAndResolutionBroadener)::broadener
 
    type(SumIsoAndConvertToTrans)::summer
-
    call summer%initialize(broadener, calcDataSelf, Kcros.eq.8)
    summer%Need_Isotopes=needIso
    summer%Another_Process_Will_Happen=moreBroadening
+   if (.not.moreBroadening.and.Kcros.EQ.6.and.dopplerOption%bType.EQ.0) then
+      CALL Nnneta (I_Iflmsc, calcData)
+   end if
    call summer%sumAndConvert(numUsedPar)
    call summer%destroy
    end subroutine sumAndConvertAfterBroadening
diff --git a/sammy/src/cro/mnrm1.f90 b/sammy/src/cro/mnrm1.f90
index ef2d17e2e1f686da4998222227eaaf69cab58905..3509409454926a720982e774eb8ef3d52a8bd09b 100644
--- a/sammy/src/cro/mnrm1.f90
+++ b/sammy/src/cro/mnrm1.f90
@@ -359,7 +359,7 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Nnneta (Iflmsc, deriv, irow, Niso)
+      SUBROUTINE Nnneta (Iflmsc, deriv)
 !
 ! *** Purpose -- Generate derivative with respect to NU
 !
@@ -369,7 +369,7 @@ contains
       use DerivativeHandler_M
       IMPLICIT None
 !
-      integer::irow, Niso
+      integer::irow
       integer::Iflmsc(*)
       real(kind=8)::val
       type(DerivativeHandler)::deriv
@@ -380,10 +380,12 @@ contains
       IF (Kjetan.LE.0) RETURN
       IF (Iflmsc(Kjetan).EQ.0) RETURN
       N = Iflmsc(Kjetan)
-      DO Iso=1,Niso
-         val = deriv%getDataNs(irow, 1, 0, iso)
-         val = val/Etanuu
-         call deriv%addDataNs(irow, 1, N, iso, val)
+      Do irow = 1, deriv%getLength()
+         DO Iso=1,deriv%getUsedIsotopes()
+            val = deriv%getDataNs(irow, 1, 0, iso)
+            val = val/Etanuu
+            call deriv%addDataNs(irow, 1, N, iso, val)
+         end do
       end do
       RETURN
       END
diff --git a/sammy/src/dbd/HighEnergyFreeGas_m.f90 b/sammy/src/dbd/HighEnergyFreeGas_m.f90
index 1b525f5510edead6d7f5e9aedfb3ec25790fe6b3..293fbcd84ea30bc89b769bf6655229c31931418a 100644
--- a/sammy/src/dbd/HighEnergyFreeGas_m.f90
+++ b/sammy/src/dbd/HighEnergyFreeGas_m.f90
@@ -35,6 +35,19 @@ end subroutine
 
 subroutine HighEnergyFreeGas_broaden(this)
    class(HighEnergyFreeGas) :: this
+
+   integer::ndatb
+   type(DerivativeHandler)::data
+
+   ! reserve the data
+   ndatb =  this%getNumEnergyBroadened()
+   write(0,*)"  I am called !!!!"
+   call this%getData(data)
+   call data%nullify()
+   call data%reserve(ndatb*data%getNnnsig(), this%numPar+1)
+
+   call this%setXoefWeights(2)
+   call this%nullifyWorkGrid(1)
 end subroutine
 
 end module HighEnergyFreeGas_m
diff --git a/sammy/src/dbd/mdbd0.f90 b/sammy/src/dbd/mdbd0.f90
index 6ebd13f78b887565399730ea6a0deba37bbf3a55..e85877da0293bcf125d461c9d72a5cc2bb0b4c3a 100644
--- a/sammy/src/dbd/mdbd0.f90
+++ b/sammy/src/dbd/mdbd0.f90
@@ -8,78 +8,34 @@ contains
 ! *** purpose -- perform High-Energy-Gaussian Approximation version of
 !                Doppler broadening
 !
-      use fixedi_m, only : K2reso, Kkkdex, Kkkrsl, Ndatd, Nudwhi, Numorr, Numorr, Numrpi
-      use ifwrit_m, only : Kvers7, Ndatb
-      use exploc_common_m
-      use array_sizes_common_m
-      use oopsch_common_m, only : Nowwww, Segmen
-      use brdd_common_m, only : Weights
-      use lbro_common_m, only : Debug, Yresol, Yssmsc
-      use AllocateFunctions_m
-      use rsl7_m
-      use mxct27_m
+      use fixedi_m, only : numUsedPar
+      use ifwrit_m, only : Kdebug
       use Dopplr_m
       IMPLICIT None
 !
-      real(kind=8),allocatable,dimension(:)::A_Iwts
       class(HighEnergyFreeGas)::broadener
-      integer::Nm, Kdatb
+      integer::Kdatb
 !
       WRITE (6,99999)
 99999 FORMAT (' *** SAMMY-DBD   15 Nov 07 ***')
-      Segmen(1) = 'D'
-      Segmen(2) = 'B'
-      Segmen(3) = 'D'
-      Nowwww = 0
 !
       CALL Initix
+
+      broadener%numPar = numUsedPar
+      broadener%debugOutput = .false.
+      if (Kdebug.ne.0) broadener%debugOutput = .true.
 !
-      Kdatb = Ndatd
-      IF (Kdatb.EQ.0) Kdatb = Ndatb
-!
+      call broadener%broaden()
 !
-! *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMDBD
-      CALL Estdbd (Kdatb)	
-!
-      Nm = Kdatb
-! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
-! *** Xcoef generates coefficients to be used in broadening
-      CALL Xcoef (Nm)
 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
 !
-      call allocate_real_data(A_Iwts, Kdatb)
 ! *** Dopplr PERFORMS DOPPLER BROADENING OPERATION (HEGA)
-      CALL Dopplr(broadener, A_Idpiso , I_Iflmsc , Weights  , A_Iwts)
-!
-      deallocate(A_Iwts)
+      CALL Dopplr_broaden(broadener)
+
 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->
 !
       CALL Write_Commons_Many
       RETURN
 !
       END
-!
-!
-! __________________________________________________________________
-!
-      SUBROUTINE Estdbd (Kdatb)
-!
-! *** purpose -- estimate array size for this segment
-!
-      IMPLICIT none
-      integer::Kdatb
-      logical Need_Isotopes
-      integer::I, K, Idimen
-      external Idimen
-!
-!x      CALL Figure_Kws_1 (Kone)
-!x      k = Kone + 2*Kdatb
-      K = 2*Kdatb
-      K = Idimen (K, 1, 'K, 1')
-      I = Idimen (K, -1, 'K, -1')
-      I = Idimen (0, 0, '0, 0')
-!
-      RETURN
-      END
 end module samdbd_m
diff --git a/sammy/src/dbd/mdbd1.f90 b/sammy/src/dbd/mdbd1.f90
index 10a4d79afb9a26246f9501beb780b5444b979ad2..8a87ae529871ccb98a3a3147a239873325f7e818 100644
--- a/sammy/src/dbd/mdbd1.f90
+++ b/sammy/src/dbd/mdbd1.f90
@@ -1,65 +1,50 @@
 module Dopplr_m
 use HighEnergyFreeGas_m
-public Dopplr
+use DerivativeHandler_M
+use ifwrit_m, only : Kvtemp,  Nolowb
+use fixedr_m, only : Emaxs, Emins
+use broad_common_m, only : Brdlim, Dopple
+use exploc_common_m, only : A_Idpiso, I_Iflmsc
+use, intrinsic :: ISO_C_BINDING
+implicit none
+public Dopplr_broaden
 contains
+      SUBROUTINE Dopplr_broaden(calc)
+      class(HighEnergyFreeGas)::calc
+      call Dopplr(calc, A_Idpiso , I_Iflmsc)
+      end SUBROUTINE
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Dopplr (calc, Dopwid, Iflmsc, Weight, Wts)
+      SUBROUTINE Dopplr (calc, Dopwid, Iflmsc)
 !
 ! *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION and derivatives
 !
-      use fixedi_m, only : Ktruet,Ndats, numUsedPar
-      use ifwrit_m, only : Kcros, Kdebug, Kfinit, Kvthck, Ndat, Nolowb, Nonu, Kvtemp
-      use fixedr_m, only : Emaxs, Emins, Thick
-      use broad_common_m, only : Brdlim, Dopple
-      use brdd_common_m, only : Ipnts, Iup, Kc
-      use lbro_common_m, only : Yresol, Yssmsc, Ytrans
-      use xct2_m
-      use mxct27_m
-      use broad_common_m
-      use Kountd_Dbd_m
-      use EndfData_common_m, only : expData
-      use AuxGridHelper_M, only : setAuxGridOffset,setAuxGridRowMax, getNumAuxGridPoints
-      use SammyGridAccess_M
-      use array_sizes_common_m, only : calcData, calcDataSelf
-      use convert_to_transmission_m
-      use normalize_and_background
-      IMPLICIT none
-      logical Another_Process_will_Happen
 !
        class(HighEnergyFreeGas)::calc
-       type(SammyGridAccess)::grid, auxGrid
-       real(kind=8):: Weight(*), Wts(*), Dopwid(*)
+       real(kind=8):: Dopwid(*)
        integer::Iflmsc(*)
        real(kind=8)::Two, val
        real(kind=8)::Ddo, e1, eKdatb, Elow, EM, Eup
        real(kind=8)::Vv, Wdop
-       integer::Iffy, Iso, Isox, J, Jwhich, nauxStart, Ipar, N
+       integer::Iffy, Iso, Isox, J, Jwhich, nauxStart, Ipar, N, iposVel
        integer::Kkkdat, Kkkkkk, Kkkmin, Now, numEl, nauxMax,insig
        integer(C_SIZE_T)::isoC
+       type(DerivativeHandler) :: calcData
+       logical(C_BOOL)::oneExtra
+       integer::Ipnts, Kc, Ndats
 
 ! *** Brdlim is now set in segment DAT
       DATA Two /2.0d0/
 
-      call grid%initialize()      
-      call grid%setToExpGrid(expData)
-      numEl = grid%getNumEnergies(expData)
-      call auxGrid%initialize()      
-      call auxGrid%setToAuxGrid(expData)
-      call setAuxGridOffset(1) ! reset the auxillary grid starting point
-
-!
-!
-! *** FORM DOPPLER-BROADENED CROSS SECTION, STORE IN Wg..
-! ***   ALSO DOPPLER-BROADEN THE PARTIAL DERIVATIVES.
-!
-      Another_Process_will_Happen = Yresol.OR.Yssmsc
-      nauxMax = getNumAuxGridPoints()
+      oneExtra = .false.
+      numEl = calc%getNumEnergyBroadened()
+      nauxMax = calc%getNumEnergyUnbroadened()
 !
+      call calc%getdata(calcData)
       call calcData%nullify()
-      call calcData%reserve(nauxMax*calcData%getNnnsig(),numUsedPar+1)
+      call calcData%reserve(nauxMax*calcData%getNnnsig(),calc%numPar+1)
       Now = 0
 !
 !
@@ -74,8 +59,6 @@ contains
          Isox = iso
 !
          Iffy = 0
-         Kc = 1
-         Iup = 0
          Ddo = Dopple
 !
 ! ***    start of major loop over energy-points
@@ -83,7 +66,7 @@ contains
          Kkkmin = 0
          Kkkdat = 0
          nauxStart = 0
-         DO 70 J=1,nauxMax
+         DO 70 J=1,numEl
             IF ((J/10000)*10000.EQ.J) WRITE (6,10000) J
 10000       FORMAT ('     *** on data point number', i10)
 !q
@@ -95,15 +78,8 @@ contains
 !q
 !qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
 !
-            IF (Another_Process_will_Happen) THEN
-               EM = auxGrid%getEnergy(J, expData)
-            ELSE
-               IF (J.GT.Ndat) THEN
-                  GO TO 80
-               ELSE
-                  Em = grid%getEnergy(J, expData)
-               END IF
-            END IF
+            Em = calc%getEnergyBroadened(J)   ! desired energy
+            iposVel = calc%getEmInUnbroadened(Em, iposVel)  ! find position (iposVel) in un-broadened grid and get the velocity
 !
             IF (Em.LT.Emins) nauxStart = J
             IF (Em.LT.Emins) GO TO 70
@@ -115,101 +91,90 @@ contains
 !                          Wdop=DOPPLER WIDTH AT Energy EM
 !
             Eup = Em + Brdlim*Wdop
-            eKdatb = auxGrid%getEnergy(nauxMax, expData)
+            eKdatb = calc%getEnergyUnbroadened(nauxMax)
             IF (Eup.GT.eKdatb) Eup = eKdatb
             Elow = Em - Brdlim*Wdop
-            e1 = auxGrid%getEnergy(1, expData)
+            e1 = calc%getEnergyUnbroadened(1)
             IF (Elow.LT.e1) Elow = e1
 !
 ! ********* find how many and which points are in integral for j
-            CALL Kountd_Dbd (Elow, Eup)
-            IF (Iup.GT.nauxMax) Iup = nauxMax
+            call calc%calcIntegralSpan(Elow, Eup, oneExtra)
+            Kc = calc%getIntegralStart()
+            Ipnts = calc%getIntegralSpan()
 !
             Kkkkkk = Kkkkkk + 1
             IF ((Nolowb.NE.0 .AND. calc%Elowbr.GT.Em) .OR. Ipnts.le.5) THEN
-! *********    IF (don't want low-E brdng, or) too few points, do not broaden
-               CALL Which_Dbd (Em, Ipnts, Jwhich, Kc)
+! *********    IF (don't want low-E brdng, or) too few points, do not broaden              
                Now = Now + 1
-               do ipar = 0, numUsedPar
+               do ipar = 0, calc%numPar
                   DO N=1, calcData%getNnnsig()
-                     val = calcData%getDataNsOld(Jwhich, N, Ipar, Isox)
+                     val = calcData%getDataNsOld(iposVel, N, Ipar, Isox)
                      if ( val.eq.0.0d0) cycle
                      call calcData%addDataNs(Kkkkkk, N, Ipar, Isox, val)
                   end do
                end do
-               IF (numUsedPar.gt.0.and.Kvtemp.GT.0) THEN
+               IF (calc%numPar.gt.0.and.Kvtemp.GT.0) THEN
                   DO N=1, calcData%getNnnsig()
                     call calcData%addDataNs(Kkkkkk, N, Kvtemp, Isox, 0.0d0)
                   end do
                END IF
             ELSE
 ! *********    Doppler-broaden
-               CALL Xdoppl (auxGrid, Weight, Wts,Em, Wdop, Iffy, Isox, Kkkkkk)
+               CALL Xdoppl (calc, Em, Wdop, Iffy, Isox, Kkkkkk)
 
             END IF
 !
 !
-
-            IF (.NOT. Another_Process_will_Happen) THEN
-! *********    eta?
-               IF (Kcros.EQ.6) CALL Nnneta (Iflmsc, calcData, Kkkkkk, 1)
-            END IF
 !
    70    CONTINUE
 ! ****** end of energy do-loop
 !
    80    CONTINUE
       END DO
+
+
 ! *** End of do loop on nuclides
 !
       nauxStart = nauxStart + 1
-      call setAuxGridRowMax(Kkkdat)
       IF (Iffy.EQ.0) WRITE (21,99998)
 99998 FORMAT (/,' ** NOTE -- NO DOPPLER BROADENING ACTUALLY OCCURED **')
       IF (Now.NE.0) WRITE (21,99997) Now, Kkkdat*calcData%getUsedIsotopes()
-      IF (Now.NE.0 .AND. Kdebug.NE.0) WRITE (06,99997) Now, Kkkdat*calcData%getUsedIsotopes()
+      IF (Now.NE.0 .AND. calc%debugOutput) WRITE (06,99997) Now, Kkkdat*calcData%getUsedIsotopes()
 99997 FORMAT (' No Doppler broadening occured', I8, ' times of a possible', I8)
+      Ndats = 1
+      Ndats = calc%getEmInUnbroadened(Emins, Ndats)
       IF (Kkkdat.LT.Ndats-2) WRITE (6,10100) Kkkdat, Ndats
 10100 FORMAT (' Kkkdat, ndats =', 2I10)
 !
-      call grid%destroy()
-      call auxGrid%destroy()
-      call dopplerOption%highEnergyFreeGas%updateBroadenedOffset(nauxStart)
-      call dopplerOption%highEnergyFreeGas%setLength(Kkkdat)
-      call setAuxGridOffset(nauxStart)
+      call calc%updateBroadenedOffset(nauxStart)
+      call calc%setLength(Kkkdat)
       RETURN
       END
 !
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Xdoppl ( grid, Weight, Wts, EM, Wdop, Iffy, Isox, irow)
+      SUBROUTINE Xdoppl ( calc, EM, Wdop, Iffy, Isox, irow)
 !
 ! *** Perform integration for Doppler-Broadening from point number
 ! ***    Kc to point number Iup
 !
-      use fixedi_m, only : numUsedPar
-      use ifwrit_m, only : Kdebug, Kvtemp
-      use fixedr_m, only : Temp
-      use brdd_common_m, only : Ipnts, Iup, Kc
-      use EndfData_common_m, only : expData
-      use SammyGridAccess_M
-      use, intrinsic :: ISO_C_BINDING
-      use array_sizes_common_m, only : calcData
-      IMPLICIT None
 
-      type(SammyGridAccess)::grid
+      class(HighEnergyFreeGas)::calc
+      type(DerivativeHandler) :: calcData
 !
-      real(kind=8)::Weight(*), Wts(*)
       real(kind=8)::Em, Wdop, val
       integer::Iffy, Isox, Ipos, irow
 !
-      real(kind=8)::Sigpls(100), Sigmns(100), Derdop(100)
-      real(kind=8)::Zero, One
+      real(kind=8)::Sigpls(100), Sigmns(100), Derdop(100)      
       real(kind=8)::Del, Derdp1, Derdp2, ewhich, Sigt, W
       integer::I, Ikc, Ipar, Iso, Jwhich, K, KS, N, Iparx
       logical(C_BOOL)::accu
-      DATA Zero /0.0d0/, One /1.0d0/
+      real(kind=8),parameter::Zero=0.0d0, One=1.0d0
+      integer::Kc, Ipnts
+      real(kind=8)::Wts
+
+      call calc%getData(calcData)
       IF (calcData%getNnnsig().GT.100) then
           STOP '[STOP in Xdoppl in dbd/mdbd1.f]'
       end if
@@ -218,14 +183,16 @@ contains
       Iffy = Iffy + 1
       KS = 1
       Iso = Isox
+      Kc = calc%getIntegralStart()
+      Ipnts = calc%getIntegralSpan()
 !
       Del = 0.02d0
       Derdop = 0d0
-      IF (numUsedPar.gt.0 .AND. Kvtemp.GT.0) THEN
+      IF (calc%numPar.gt.0 .AND. Kvtemp.GT.0) THEN
          W = Wdop*(One+Del)
-         CALL Fundop (W, EM, grid, Weight, Wts, Sigpls, Isox)
+         CALL Fundop (calc, W, EM, Sigpls, Isox)
          W = Wdop*(One-Del)
-         CALL Fundop (W, EM, grid, Weight, Wts, Sigmns, Isox)
+         CALL Fundop (calc, W, EM, Sigmns, Isox)
          DO I=1,calcData%getNnnsig()
             Derdop(I) = 0.5d0*(Sigpls(I)-Sigmns(I))/(Del*Wdop)
          END DO
@@ -233,21 +200,22 @@ contains
 !
 ! *** Simpson rule -- figure Wts = 0.5 * gaussian *
 ! ***                              [ Energy(I+1)-Energy(I-1) ]
-      IF (Ipnts.LE.12) CALL Simpsn (EM, grid, Wts, Wdop)
+      IF (Ipnts.LE.12) CALL Simpsn (calc, EM, Wdop)
 !
 ! *** 4-point quadrature rule Wts = Weight * gaussian
-      IF (Ipnts.GT.12) CALL Dopbrd (EM, grid, Weight, Wts, Wdop)
+      IF (Ipnts.GT.12) CALL Dopbrd (calc, EM,  Wdop)
 !
       accu = .true.
       call calcData%setAccumulate(accu)
       DO N=1,calcData%getNnnsig()
          ! update cross section (ipar=0) as well as derivatives
-         Do Ipar = 0, numUsedPar
+         Do Ipar = 0, calc%numPar
             val = 0.0
             DO I=1,Ipnts
-                IF (Wts(I).eq.Zero) cycle
+                Wts = calc%getWorkData(1, 1, I)
+                IF (Wts.eq.Zero) cycle
                 Ikc = I + Kc - 1
-                val = val + calcData%getDataNsOld(Ikc,N, Ipar, Iso)*Wts(I)
+                val = val + calcData%getDataNsOld(Ikc,N, Ipar, Iso)*Wts
             end do
             if (val.eq.0) cycle
             call calcData%addDataNs(irow, N, Ipar, Iso, val)
@@ -256,15 +224,15 @@ contains
       accu = .false.
       call calcData%setAccumulate(accu)
 !
-      IF (Kvtemp.GT.0.and.numUsedPar.GT.0) THEN
+      IF (Kvtemp.GT.0.and.calc%numPar.GT.0) THEN
          DO N=1,calcData%getNnnsig()
-            val = Derdop(N)*Wdop*0.5d0/Temp
+            val = Derdop(N)*Wdop*0.5d0/calc%getTemperature()
             call calcData%addDataNs(irow, N, Kvtemp, Iso, val)
          END DO
       END IF
 !
-      IF (Kdebug.EQ.0 .OR. Kvtemp.LE.0) RETURN
-      IF (numUsedPar.EQ.0) RETURN
+      IF (.not.calc%debugOutput.OR. Kvtemp.LE.0) RETURN
+      IF (calc%numPar.EQ.0) RETURN
 !
 ! *** here for debug info only
       Sigt = calcData%getDataNs(irow, 1, 0, Iso)
@@ -279,8 +247,7 @@ contains
       RETURN
 !
    60 CONTINUE
-      Jwhich = (Kc+Iup)/2
-      ewhich = grid%getEnergy(Jwhich, expData)
+      ewhich = em
       WRITE (6,99999) ewhich, Derdp1, Derdop(1), Derdp2
 99999 FORMAT (' ** WARNING ON Dopplr DERIV--E,D1,D,D2=', F8.1,  &
            3(1PG11.3))
@@ -290,37 +257,39 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Dopbrd (Em, grid, Weight, Wts, Widgau)
+      SUBROUTINE Dopbrd (calc, Em, Widgau)
 !
 ! *** FORM THE GAUSSIAN DOPPLER WeightS AND NORMALIZE THEM
 !
-      use brdd_common_m, only : Ipnts, Kc
-      use EndfData_common_m, only : expData
-      use SammyGridAccess_M
-      IMPLICIT None
-!
-      real(kind=8)::Weight(*), Wts(*), Em, Widgau
-      type(SammyGridAccess)::grid  ! this is possible in fixed form g77 as in same compile unit
+      real(kind=8):: Em, Widgau
       real(kind=8)::e1, S, Y, Z
       integer::I
+      class(HighEnergyFreeGas)::calc
+      integer::Ipnts, Kc
+      real(kind=8)::Wts
+
 !
       Y = 85.0D0
+      Ipnts = calc%getIntegralSpan()
+      Kc = calc%getIntegralStart()
       DO I=1,Ipnts
-         e1 = grid%getEnergy(I+Kc-1, expData)
+         e1 = calc%getEnergyUnbroadened(I+Kc-1)
          Z = (e1-Em)/Widgau
          Z = Z*Z
          IF (Z.GT.Y) Z = Y
          Z = dEXP(-Z)
-         Wts(I) = Weight(I+kc-1)*Z
+         Wts = calc%getWorkData(2,1, I+kc-1)*Z
+         call calc%setWorkData(1, 1, I, Wts)
       END DO
 !
       S = 0.0D0
       DO I=1,Ipnts
-         S = S + Wts(I)
+         S = S + calc%getWorkData(1,1, I)
       END DO
       S = 1.0D0/S
       DO I=1,Ipnts
-         Wts(I) = Wts(I)*S
+         Wts = calc%getWorkData(1,1, I)*S
+         call calc%setWorkData(1, 1, I, Wts)
       END DO
 !
       RETURN
@@ -329,59 +298,59 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Simpsn (Em, grid, Wts, Widgau)
+      SUBROUTINE Simpsn (calc, Em, Widgau)
 !
 ! *** Form the Gaussian Doppler Weights via Simpson's rule, and
 ! ***      normalize them
 !
-      use brdd_common_m, only : Ipnts, Kc
-      use EndfData_common_m, only : expData
-      use AuxGridHelper_M, only : getNumAuxGridPoints
-      use SammyGridAccess_M
-      IMPLICIT None
 !
-      real(kind=8)::Wts(*)
+      real(kind=8)::Wts
       real(kind=8)::Em, Widgau
-      type(SammyGridAccess)::grid  ! this is possible in fixed form g77 as in same compile unit
+      class(HighEnergyFreeGas)::calc
 
       real(kind=8)::eval1, eval2, eval3, S, Y, Z
-      integer::I, J, nauxMax
+      integer::I, J, nauxMax, Ipnts, Kc
 !
+      Ipnts = calc%getIntegralSpan()
+      Kc = calc%getIntegralStart()
       J = Ipnts
-      nauxMax = getNumAuxGridPoints()
+      nauxMax = calc%getNumEnergyUnbroadened()
       IF (Kc+Ipnts.GT.nauxMax) J = Ipnts - 1
       Ipnts = J
 !
       Y = 85.0D0
          I = 1
-         eval1 = grid%getEnergy(I+Kc-1, expData)
+         eval1 = calc%getEnergyUnbroadened(I+Kc-1)
          Z = (eval1-Em)/Widgau
          Z = Z*Z
          IF (Z.GT.Y) Z = Y
          Z = dEXP(-Z)
-         eval2 = grid%getEnergy(I+Kc, expData)
-         Wts(I) = (eval2-eval1)*Z
+         eval2 = calc%getEnergyUnbroadened(I+Kc)
+         Wts = (eval2-eval1)*Z
+         call calc%setWorkData(1,1, I, Wts)
 ! ***    note that we must treat i=1 case separately to avoid
 ! ***       trying to use index at 0
       DO I=2,Ipnts
-         eval1 = grid%getEnergy(I+Kc-1, expData)
+         eval1 = calc%getEnergyUnbroadened(I+Kc-1)
          Z = (eval1-Em)/Widgau
          Z = Z*Z
          IF (Z.GT.Y) Z = Y
          Z = dEXP(-Z)
-         eval2 = grid%getEnergy(I+Kc, expData)
-         eval3 = grid%getEnergy(I+Kc - 2, expData)
-         Wts(I) = (eval2-eval3)*Z
+         eval2 = calc%getEnergyUnbroadened(I+Kc)
+         eval3 = calc%getEnergyUnbroadened(I+Kc - 2)
+         Wts = (eval2-eval3)*Z
+         call calc%setWorkData(1,1, I, Wts)
 ! ****** note there should be a 1/2 factor, but we'll normalize anyway
       END DO
 !
       S = 0.0D0
       DO I=1,Ipnts
-         S = S + Wts(I)
+         S = S + calc%getWorkData(1,1,I)
       END DO
       S = 1.0D0/S
       DO I=1,Ipnts
-         Wts(I) = Wts(I)*S
+         Wts = calc%getWorkData(1,1,I)*S
+         call calc%setWorkData(1,1, I, Wts)
       END DO
 !
       RETURN
@@ -390,29 +359,30 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Fundop (Wdop, Em, grid, Weight, Wts, Sum, Isox)
+      SUBROUTINE Fundop (calc, Wdop, Em, Sum, Isox)
 !
-      use brdd_common_m, only : Ipnts, Kc
-      use EndfData_common_m, only : expData
-      use SammyGridAccess_M
-      use array_sizes_common_m, only : calcData
-      IMPLICIT None
-      type(SammyGridAccess)::grid  ! this is possible in fixed form g77 as in same compile unit
-      real(kind=8):: Wts(*), Sum(*), weight(*), Wdop, Em
+      type(DerivativeHandler) :: calcData
+      real(kind=8):: Sum(*),  Wdop, Em
       integer::isox
-      real(kind=8)::Zero, val
-      integer::I, Ikc, N
-      DATA Zero /0.0d0/
-!
-      IF (Ipnts.LE.12) CALL Simpsn (Em, grid, Wts, Wdop)
-      IF (Ipnts.GT.12) CALL Dopbrd (Em, grid, Weight, Wts, Wdop)
-      CALL Zero_Array (Sum, calcData%getNnnsig())
+      real(kind=8)::val
+      integer::I, Ikc, N, Ipnts, Kc
+      class(HighEnergyFreeGas)::calc
+      real(kind=8),parameter :: Zero = 0.0d0
+      real(kind=8)::Wts
+!
+      Ipnts = calc%getIntegralSpan()
+      Kc = calc%getIntegralStart()
+      call calc%getdata(calcData)
+      IF (Ipnts.LE.12) CALL Simpsn (calc, Em, Wdop)
+      IF (Ipnts.GT.12) CALL Dopbrd (calc, Em, Wdop)
+      Sum(1:calcData%getNnnsig()) = Zero
       DO I=1,Ipnts
-         IF (Wts(I).NE.Zero) THEN
+         Wts = calc%getWorkData(1,1,I)
+         IF (Wts.NE.Zero) THEN
             Ikc = I + Kc - 1
             DO N=1,calcData%getNnnsig()
                val = calcData%getDataNsOld(Ikc, N, 0, Isox)
-               Sum(N) = Sum(N) + Wts(I)*val
+               Sum(N) = Sum(N) + Wts*val
             END DO
          END IF
       END DO
diff --git a/sammy/src/dbd/mdbd3.f90 b/sammy/src/dbd/mdbd3.f90
deleted file mode 100644
index 9ee969a84c52e43924e3a0dee523ade4e552dbff..0000000000000000000000000000000000000000
--- a/sammy/src/dbd/mdbd3.f90
+++ /dev/null
@@ -1,71 +0,0 @@
-module Kountd_Dbd_m
-public Kountd_Dbd, Which_Dbd
-contains
-!
-!
-! --------------------------------------------------------------
-!
-      SUBROUTINE Kountd_Dbd (Elow, Eup)
-!
-! *** Purpose -- FIND Kc AND Iup, ALSO Ipnts
-!
-      use brdd_common_m, only : Ipnts, Iup, Kc
-      use EndfData_common_m, only : expData     
-      use SammyGridAccess_M
-      IMPLICIT none
-      type(SammyGridAccess)::grid
-      real(kind=8)::Elow, Eup
-      real(kind=8)::elowGrid, eupGrid
-      integer::Ilow
-
-      call grid%initialize()
-      call grid%setToAuxGrid(expData)
-
-      Ilow = Kc - 1
-   10 Ilow = Ilow + 1
-      elowGrid = grid%getEnergy(Ilow, expData)
-      IF (elowGrid.LE.Elow) GO TO 10
-   20 Iup = Iup + 1
-      eupGrid = grid%getEnergy(Iup, expData)
-      IF (eupGrid.LT.Eup) GO TO 20
-      Ilow = Ilow - 2
-      IF (Ilow.LT.0) Ilow = 0
-      Ipnts = Iup - Ilow
-      Kc = Ilow + 1
-      Iup = Iup - 1
-      call grid%destroy()
-      RETURN
-      END
-!
-!
-! --------------------------------------------------------------
-!
-      SUBROUTINE Which_Dbd (EM, Ipnts, Jwhich, Kc)
-      use EndfData_common_m, only : expData      
-      use SammyGridAccess_M
-      IMPLICIT None
-      type(SammyGridAccess)::grid
-      integer::Ipnts, Jwhich, Kc
-      real(kind=8)::EM
-      real(kind=8)::A, Ddd, e1, e2
-      integer::I
-
-      call grid%initialize()      
-      call grid%setToAuxGrid(expData)
-!
-      Jwhich = 0
-      e1 = grid%getEnergy(Ipnts+Kc-1, expData)
-      e2 = grid%getEnergy(kc, expData)
-      Ddd = e1 - e2
-      DO I=1,Ipnts
-         e1 = grid%getEnergy(I+Kc-1, expData)
-         A = dABS(e1-EM)
-         IF (A.LE.Ddd) Jwhich = I
-         IF (A.LE.Ddd) Ddd = A
-      END DO
-      IF (Jwhich.EQ.0) Jwhich = 1
-      Jwhich = Kc + Jwhich - 1
-      call grid%destroy()
-      RETURN
-      END
-end module Kountd_Dbd_m
diff --git a/sammy/src/dop/LealHwangBroadening_M.f90 b/sammy/src/dop/LealHwangBroadening_M.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e9c4279309ce3dc5df2123251e89e47b0aacb6a7
--- /dev/null
+++ b/sammy/src/dop/LealHwangBroadening_M.f90
@@ -0,0 +1,49 @@
+module LealHwangBroadening_M
+use FreeGasDopplerBroadening_M
+use DopplerBroadening_M
+use DerivativeHandler_M
+use GridData_M
+use, intrinsic :: ISO_C_BINDING
+
+
+implicit none
+
+type, extends(FreeGasDopplerBroadening) :: LealHwangBroadening
+contains
+procedure, pass(this) :: initialize => LealHwangBroadening_initialize
+procedure, pass(this) :: broaden => LealHwangBroadening_broaden
+procedure, pass(this) :: destroy => LealHwangBroadening_destroy
+end type LealHwangBroadening
+
+contains
+subroutine LealHwangBroadening_initialize(this, hand, list, work)
+    implicit none
+    class(LealHwangBroadening) :: this
+    class(DerivativeHandler)::hand
+    class(GridDataList)::list
+    class(GridDataList)::work
+    call FreeGasDopplerBroadening_initialize(this, hand, list, work)
+end subroutine
+
+subroutine LealHwangBroadening_destroy(this)
+    implicit none
+    class(LealHwangBroadening) :: this
+    call FreeGasDopplerBroadening_destroy(this)
+end subroutine
+
+
+
+subroutine LealHwangBroadening_broaden(this)
+   class(LealHwangBroadening) :: this
+
+   integer::ndatb
+   type(DerivativeHandler)::data
+
+   ! reserve the data
+   ndatb =  this%getNumEnergyBroadened()
+   call this%getData(data)
+   call data%nullify()
+   call data%reserve(ndatb*data%getNnnsig(), this%numPar+1)
+end subroutine
+
+end module LealHwangBroadening_M
diff --git a/sammy/src/fgm/mfgm1.f90 b/sammy/src/fgm/mfgm1.f90
index cea3f5bfae3d21cffedf73ee437acd66e30bdc94..b976d457ea820e88b29eaeb21a6f091914626855 100644
--- a/sammy/src/fgm/mfgm1.f90
+++ b/sammy/src/fgm/mfgm1.f90
@@ -1,4 +1,14 @@
 module mfgm1_m
+use ifwrit_m, only : Ksitmp, Nolowb, Kvtemp
+use fixedr_m, only : Emax, Emin, Emins, Sitemp, Emaxs
+use EndfData_common_m, only : resparData
+use mfgm3_M
+use mfgm4_m
+use FreeGasDopplerBroadening_M
+IMPLICIT none
+
+public Dopfgm
+
 contains
 !
 !
@@ -8,14 +18,6 @@ contains
 !
 ! *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION AND DERIVATIVES
 !
-      use ifwrit_m, only : Ksitmp, Nolowb, Kvtemp
-      use fixedr_m, only : Emax, Emin, Emins, Sitemp, Emaxs
-      use EndfData_common_m, only : resparData      
-      use mfgm3_M
-      use mfgm4_m    
-      use FreeGasDopplerBroadening_M
-
-      IMPLICIT None
 
       type(FreeGasDopplerBroadening)::broadener
       type(DerivativeHandler)::calcData
diff --git a/sammy/src/fgm/mfgm4.f90 b/sammy/src/fgm/mfgm4.f90
index 8ceca181e1c13854cad46da4b44538db1a33ca33..58cac2ccca933101213828622891e7235b745444 100644
--- a/sammy/src/fgm/mfgm4.f90
+++ b/sammy/src/fgm/mfgm4.f90
@@ -3,6 +3,7 @@ module mfgm4_m
   use DerivativeHandler_M
   use FreeGasDopplerBroadening_M
   use, intrinsic :: ISO_C_BINDING
+  IMPLICIT None
 
 
   public  Xdofgm
@@ -18,7 +19,6 @@ module mfgm4_m
 ! *** PERFORM INTEGRATION FOR DOPPLER-BROADENING FROM POINT NUMBER
 ! ***   calc%Kc TO POINT NUMBER Iup
 !
-      IMPLICIT None
 
       integer::Iffy, Ktempx, Isox, Ngtvx
       real(kind=8)::Velcty(*), Wts(*), Em, Vv, Ddo, Tempx
@@ -180,7 +180,6 @@ module mfgm4_m
 !
       SUBROUTINE Funfgm (calc, Ddo, Vv, Velcty, Wts, Sum, Isox, derivs)
 !
-      IMPLICIT None
       real(kind=8)::Velcty(*), Wts(*), Sum(*)
       real(kind=8)::Ddo, Vv
       integer::Isox, Nb
diff --git a/sammy/src/sammy/CMakeLists.txt b/sammy/src/sammy/CMakeLists.txt
index 948e59bf5af9fc97df2e278f38b3d61926b1c44f..109b3532b6d213685806655aa6a93298aff047fb 100644
--- a/sammy/src/sammy/CMakeLists.txt
+++ b/sammy/src/sammy/CMakeLists.txt
@@ -60,6 +60,7 @@ APPEND_SET(SAMMY_SOURCES
             ../clm/mclm7.f
             ../clm/mclm8.f
             ../clm/mclm8a.f90
+            ../clm/CrystalLatticeBroadening_M.f90
 
             ../clq/mclq0.f90
             ../clq/ArtificalCross_M.f90
@@ -94,7 +95,6 @@ APPEND_SET(SAMMY_SOURCES
             ../dbd/mdbd0.f90
             ../dbd/mdbd1.f90
             ../dbd/mdbd2.f90
-            ../dbd/mdbd3.f90
             ../dbd/HighEnergyFreeGas_m.f90
 
             ../dex/mdex0.f
@@ -103,6 +103,7 @@ APPEND_SET(SAMMY_SOURCES
             ../dop/mdop0.f90
             ../dop/mdop1.f90
             ../dop/mdop2.f90
+            ../dop/LealHwangBroadening_M.f90
 
             ../end/mend0.f
             ../end/mend1.f