diff --git a/cmake/source_list_KKRhost.txt b/cmake/source_list_KKRhost.txt
index 62ccdffe998b3f9f19457c719e1a92e5ff4879ec..a4c9d117019d3b320921a09fe6e799adec725e62 100644
--- a/cmake/source_list_KKRhost.txt
+++ b/cmake/source_list_KKRhost.txt
@@ -389,6 +389,7 @@ add_library(lib_kkrhost STATIC
     source/KKRhost/wrmoms.f90
     source/KKRhost/wunfiles.F90
     source/KKRhost/ylag.f90
+    source/KKRhost/write_gflle_npy.f90
 )
 # disable cmake auto add of 'lib' prefix to .so file
 SET_TARGET_PROPERTIES(lib_kkrhost PROPERTIES PREFIX "")
diff --git a/source/KKRhost/rhovalnew.F90 b/source/KKRhost/rhovalnew.F90
index 8c4f9c3d8b06da3011e5b9a61a4a826c351fe633..fe02e44e4b7f429adac9112e72543c16b9e308ac 100644
--- a/source/KKRhost/rhovalnew.F90
+++ b/source/KKRhost/rhovalnew.F90
@@ -41,7 +41,7 @@ contains
     use :: mod_save_wavefun, only: t_wavefunctions, read_wavefunc
     use :: mod_runoptions, only: calc_exchange_couplings, calc_gmat_lm_full, disable_tmat_sratrick, fix_nonco_angles, &
                                  use_qdos, write_complex_qdos, write_pkkr_operators, write_DOS_lm, set_cheby_nospeedup, &
-                                 decouple_spins_cheby, disable_print_serialnumber
+                                 decouple_spins_cheby, disable_print_serialnumber, gflle_to_npy
     use :: mod_version_info, only: version_print_header
     use :: global_variables, only: lmmaxd, iemxd, ncleb, lmxspd, irmd, ntotd, nrmaxd, lmpotd, nspotd, nfund, korbit, mmaxd, nspind, angles_cutoff
     use :: mod_constants, only: czero, cvlight, cone, pi, ci
@@ -62,6 +62,7 @@ contains
     use :: mod_wunfiles, only: t_params
     use :: mod_bfield, only: add_bfield
     use :: mod_torque, only: calc_torque
+    use mod_write_gflle, only: write_gflle_to_npy
 
     implicit none
 
@@ -400,7 +401,7 @@ contains
 #else
     i1_myrank = i1                 ! lmlm-dos ruess
 #endif
-    if ((calc_gmat_lm_full) .and. (i1_myrank==1)) then ! lmlm-dos ruess
+    if ((calc_gmat_lm_full) .and. (i1_myrank==1) .and..not.gflle_to_npy) then ! lmlm-dos ruess
       lrecgflle = nspin*(1+korbit)*lmmaxd*lmmaxd*ielast*nqdos ! lmlm-dos ruess
       open (91, access='direct', recl=lrecgflle, file='gflle' & ! lmlm-dos ruess
         , form='unformatted', status='replace', err=110, iostat=ierr) ! lmlm-dos ruess
@@ -984,7 +985,11 @@ contains
         if (t_inc%i_write>0) then  ! lmlm-dos
           write (1337, *) 'gflle:', shape(gflle), shape(gflle_part), lrecgflle ! lmlm-dos
         end if                     ! lmlm-dos
-        write (91, rec=i1) gflle   ! lmlm-dos
+        if (gflle_to_npy) then
+          call write_gflle_to_npy(lmmaxd, ielast, nqdos, i1, gflle)
+        else
+          write (91, rec=i1) gflle   ! lmlm-dos
+        end if
       end if                       ! lmlm-dos
 
       allocate (rhotemp(irmdnew,lmpotd), stat=i_stat)
diff --git a/source/KKRhost/write_gflle_npy.f90 b/source/KKRhost/write_gflle_npy.f90
new file mode 100644
index 0000000000000000000000000000000000000000..91f4ce59a9bbef38a0e09417ee4c24396e8d53d5
--- /dev/null
+++ b/source/KKRhost/write_gflle_npy.f90
@@ -0,0 +1,1083 @@
+module m_npy
+   implicit none
+
+   integer(4), parameter               :: p_un = 23
+   character, parameter                :: magic_num = achar(147) ! x93
+   character, parameter                :: major = achar(2)   !major *.npy version
+   character, parameter                :: minor = achar(0)   !minor *.npy version
+   character(len=*), parameter         :: zip_flag = "-q0"
+   character(len=*), parameter         :: magic_str = "NUMPY"
+
+   interface save_npy
+      module procedure write_int64_vec, write_int64_mtx, &
+         write_int32_vec, write_int32_mtx, write_int32_3d, &
+         write_int16_vec, write_int16_mtx, &
+         write_int8_vec, write_int8_mtx, write_int8_3d, &
+         write_dbl_vec, write_dbl_mtx, &
+         write_sng_vec, write_sng_mtx, &
+         write_cmplx_sgn_vec, write_cmplx_sgn_mtx, &
+         write_cmplx_dbl_vec, write_cmplx_dbl_mtx, &
+         write_sng_3dT, write_dbl_3dT, &
+         write_sng_4dT, write_dbl_4dT, &
+         write_dbl_5dT, &
+         write_cmplx_dbl_3dT, &
+         write_cmplx_dbl_4dT, &
+         write_cmplx_dbl_5dT, &
+         write_cmplx_dbl_6dT
+
+   end interface save_npy
+   interface add_npz
+      module procedure addrpl_int8_vec, addrpl_int8_mtx, &
+         addrpl_int16_vec, addrpl_int16_mtx, &
+         addrpl_int32_vec, addrpl_int32_mtx, &
+         addrpl_int64_vec, addrpl_int64_mtx, &
+         addrpl_sng_vec, addrpl_sng_mtx, &
+         addrpl_dbl_vec, addrpl_dbl_mtx, &
+         addrpl_cmplx_dbl_vec, addrpl_cmplx_dbl_mtx, &
+         addrpl_cmplx_sng_vec, addrpl_cmplx_sng_mtx
+   end interface add_npz
+
+contains
+   subroutine run_sys(cmd, stat)
+      implicit none
+      character(len=*), intent(in)     :: cmd
+      integer(4), intent(out)          :: stat
+
+      call execute_command_line(cmd, wait=.True., exitstat=stat)
+   end subroutine run_sys
+
+   subroutine addrpl_cmplx_sng_vec(zipfile, var_name, vec)
+      implicit none
+      complex(4), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_cmplx_sng_vec
+
+   subroutine addrpl_cmplx_sng_mtx(zipfile, var_name, mtx)
+      implicit none
+      complex(4), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_cmplx_sng_mtx
+
+   subroutine addrpl_cmplx_dbl_vec(zipfile, var_name, vec)
+      implicit none
+      complex(8), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_cmplx_dbl_vec
+
+   subroutine addrpl_cmplx_dbl_mtx(zipfile, var_name, mtx)
+      implicit none
+      complex(8), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_cmplx_dbl_mtx
+
+   subroutine addrpl_dbl_vec(zipfile, var_name, vec)
+      implicit none
+      real(8), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_dbl_vec
+
+   subroutine addrpl_dbl_mtx(zipfile, var_name, mtx)
+      implicit none
+      real(8), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_dbl_mtx
+
+   subroutine addrpl_sng_vec(zipfile, var_name, vec)
+      implicit none
+      real(4), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_sng_vec
+
+   subroutine addrpl_sng_mtx(zipfile, var_name, mtx)
+      implicit none
+      real(4), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_sng_mtx
+
+   subroutine addrpl_int8_vec(zipfile, var_name, vec)
+      implicit none
+      integer(1), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int8_vec
+
+   subroutine addrpl_int8_mtx(zipfile, var_name, mtx)
+      implicit none
+      integer(1), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int8_mtx
+
+   subroutine addrpl_int16_vec(zipfile, var_name, vec)
+      implicit none
+      integer(2), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int16_vec
+
+   subroutine addrpl_int16_mtx(zipfile, var_name, mtx)
+      implicit none
+      integer(2), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int16_mtx
+
+   subroutine addrpl_int32_vec(zipfile, var_name, vec)
+      implicit none
+      integer(4), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int32_vec
+
+   subroutine addrpl_int32_mtx(zipfile, var_name, mtx)
+      implicit none
+      integer(4), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int32_mtx
+
+   subroutine addrpl_int64_vec(zipfile, var_name, vec)
+      implicit none
+      integer(8), intent(in)           :: vec(:)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, vec)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int64_vec
+
+   subroutine addrpl_int64_mtx(zipfile, var_name, mtx)
+      implicit none
+      integer(8), intent(in)           :: mtx(:, :)
+      character(len=*), intent(in)     :: zipfile, var_name
+      character(len=:), allocatable    :: npy_name
+      integer(4)                       :: succ
+
+      npy_name = var_name//".npy"
+
+      call save_npy(npy_name, mtx)
+      ! just store and be quite while zipping
+      call run_sys("zip "//zip_flag//" "//zipfile &
+                   //" "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute zip command"
+      endif
+
+      call run_sys("rm "//npy_name, succ)
+      if (succ /= 0) then
+         write (*, *) "Can't execute rm command"
+      endif
+   end subroutine addrpl_int64_mtx
+
+   Subroutine write_cmplx_sgn_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(4), intent(in)           :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<c8"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+      write (p_un) header_len
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_cmplx_sgn_mtx
+
+   Subroutine write_cmplx_sgn_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(4), intent(in)           :: vec(:)
+      character(len=*), parameter      :: var_type = "<c8"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_cmplx_sgn_vec
+
+   Subroutine write_cmplx_dbl_6dT(filename, tensor)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(8), intent(in)           :: tensor(:, :, :, :, :, :)
+      character(len=*), parameter      :: var_type = "<c16"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor))
+      write (p_un) tensor
+      close (unit=p_un)
+   End Subroutine write_cmplx_dbl_6dT
+
+   Subroutine write_cmplx_dbl_5dT(filename, tensor)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(8), intent(in)           :: tensor(:, :, :, :, :)
+      character(len=*), parameter      :: var_type = "<c16"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor))
+      write (p_un) tensor
+      close (unit=p_un)
+   End Subroutine write_cmplx_dbl_5dT
+
+   Subroutine write_cmplx_dbl_4dT(filename, tensor)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(8), intent(in)           :: tensor(:, :, :, :)
+      character(len=*), parameter      :: var_type = "<c16"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor))
+      write (p_un) tensor
+      close (unit=p_un)
+   End Subroutine write_cmplx_dbl_4dT
+
+   Subroutine write_cmplx_dbl_3dT(filename, tensor)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(8), intent(in)           :: tensor(:, :, :)
+      character(len=*), parameter      :: var_type = "<c16"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor))
+      write (p_un) tensor
+      close (unit=p_un)
+   End Subroutine write_cmplx_dbl_3dT
+
+   Subroutine write_cmplx_dbl_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(8), intent(in)           :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<c16"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_cmplx_dbl_mtx
+
+   Subroutine write_cmplx_dbl_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      complex(8), intent(in)           :: vec(:)
+      character(len=*), parameter      :: var_type = "<c16"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_cmplx_dbl_vec
+
+   Subroutine write_sng_3dT(filename, tensor)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(4), intent(in)              :: tensor(:, :, :)
+      character(len=*), parameter      :: var_type = "<f4"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor))
+      write (p_un) tensor
+      close (unit=p_un)
+   End Subroutine write_sng_3dT
+
+   Subroutine write_sng_4dT(filename, tensor)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(4), intent(in)              :: tensor(:, :, :, :)
+      character(len=*), parameter      :: var_type = "<f4"
+      integer(4)                       :: header_len
+
+      header_len = len(dict_str(var_type, shape(tensor)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor))
+      write (p_un) tensor
+      close (unit=p_un)
+   End Subroutine write_sng_4dT
+
+   Subroutine write_sng_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(4), intent(in)              :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<f4"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_sng_mtx
+
+   Subroutine write_sng_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(4), intent(in)              :: vec(:)
+      character(len=*), parameter      :: var_type = "<f4"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_sng_vec
+
+   Subroutine write_dbl_3dT(filename, tensor)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(8), intent(in)              :: tensor(:, :, :)
+      character(len=*), parameter      :: var_type = "<f8"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor))
+      write (p_un) tensor
+      close (unit=p_un)
+   End Subroutine write_dbl_3dT
+
+   Subroutine write_dbl_4dT(filename, tensor4)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(8), intent(in)              :: tensor4(:, :, :, :)
+      character(len=*), parameter      :: var_type = "<f8"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor4)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor4))
+      write (p_un) tensor4
+      close (unit=p_un)
+   End Subroutine write_dbl_4dT
+
+   Subroutine write_dbl_5dT(filename, tensor5)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(8), intent(in)              :: tensor5(:, :, :, :, :)
+      character(len=*), parameter      :: var_type = "<f8"
+      integer(4)                       :: header_len, i, j, k
+
+      header_len = len(dict_str(var_type, shape(tensor5)))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, shape(tensor5))
+      write (p_un) tensor5
+      close (unit=p_un)
+   End Subroutine write_dbl_5dT
+
+   Subroutine write_dbl_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(8), intent(in)              :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<f8"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_dbl_mtx
+
+   Subroutine write_dbl_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      real(8), intent(in)              :: vec(:)
+      character(len=*), parameter      :: var_type = "<f8"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_dbl_vec
+
+   Subroutine write_int64_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(8), intent(in)           :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<i8"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_int64_mtx
+
+   Subroutine write_int64_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(8), intent(in)           :: vec(:)
+      character(len=*), parameter      :: var_type = "<i8"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_int64_vec
+
+   Subroutine write_int32_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(4), intent(in)           :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<i4"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_int32_mtx
+
+   Subroutine write_int32_3d(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(4), intent(in)           :: mtx(:,:,:)
+      character(len=*), parameter      :: var_type = "<i4"
+      integer(4)                       :: header_len, s_mtx(3), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_int32_3d
+
+   Subroutine write_int32_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(4), intent(in)           :: vec(:)
+      character(len=*), parameter      :: var_type = "<i4"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_int32_vec
+
+   Subroutine write_int16_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(2), intent(in)           :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<i2"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_int16_mtx
+
+   Subroutine write_int16_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(2), intent(in)           :: vec(:)
+      character(len=*), parameter      :: var_type = "<i2"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_int16_vec
+
+   Subroutine write_int8_mtx(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(1), intent(in)           :: mtx(:, :)
+      character(len=*), parameter      :: var_type = "<i1"
+      integer(4)                       :: header_len, s_mtx(2), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_int8_mtx
+
+   Subroutine write_int8_3d(filename, mtx)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(1), intent(in)           :: mtx(:,:,:)
+      character(len=*), parameter      :: var_type = "<i1"
+      integer(4)                       :: header_len, s_mtx(3), i, j
+
+      s_mtx = shape(mtx)
+      header_len = len(dict_str(var_type, s_mtx))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_mtx)
+
+      write (p_un) mtx
+
+      close (unit=p_un)
+   End Subroutine write_int8_3d
+
+   Subroutine write_int8_vec(filename, vec)
+      Implicit None
+      character(len=*), intent(in)     :: filename
+      integer(1), intent(in)           :: vec(:)
+      character(len=*), parameter      :: var_type = "<i1"
+      integer(4)                       :: header_len, s_vec(1), i
+
+      s_vec = shape(vec)
+      header_len = len(dict_str(var_type, s_vec))
+
+      open (unit=p_un, file=filename, form="unformatted", &
+            access="stream")
+      write (p_un) magic_num, magic_str, major, minor
+
+      write (p_un) header_len
+
+      write (p_un) dict_str(var_type, s_vec)
+
+      write (p_un) vec
+
+      close (unit=p_un)
+   End Subroutine write_int8_vec
+
+   function dict_str(var_type, var_shape) result(str)
+      implicit none
+      character(len=*), intent(in)   :: var_type
+      integer(4), intent(in)         :: var_shape(:)
+      character(len=:), allocatable  :: str
+      integer(4)                     :: cnt
+
+      cnt = len("{'descr': '")
+      cnt = cnt + len(var_type)
+      cnt = cnt + len("', 'fortran_order': True, 'shape': (")
+      cnt = cnt + len(shape_str(var_shape))
+      cnt = cnt + len(",), }")
+      do while (mod(cnt + 10, 16) /= 0)
+         cnt = cnt + 1
+      enddo
+
+      allocate (character(cnt) :: str)
+
+      str = "{'descr': '"//var_type// &
+            "', 'fortran_order': True, 'shape': ("// &
+            shape_str(var_shape)//"), }"
+
+      do while (mod(len(str) + 11, 16) /= 0)
+         str = str//" "
+      enddo
+
+      str = str//achar(10)
+
+   end function dict_str
+
+   function shape_str(var_shape) result(fin_str)
+      implicit none
+      integer(4), intent(in)        :: var_shape(:)
+      character(len=:), allocatable :: str, small_str, fin_str
+      integer(4)                    :: i, length, start, halt
+
+      length = 14*size(var_shape)
+      allocate (character(length) :: str)
+      allocate (character(14)     :: small_str)
+      str = " "
+
+      do i = 1, size(var_shape)
+         start = (i - 1)*length + 1
+         halt = i*length + 1
+         write (small_str, "(I13,A)") var_shape(i), ","
+         str = trim(str)//adjustl(small_str)
+      enddo
+
+      fin_str = trim(str)
+   end function shape_str
+end module m_npy
+
+
+module mod_write_gflle 
+
+  implicit none
+
+contains
+
+  subroutine write_gflle_to_npy(lmmaxd, ielast, nqdos, i1, gflle)
+
+    use mod_datatypes, only: dp
+    use m_npy, only: save_npy
+    implicit none
+    integer, intent(in) :: lmmaxd, ielast, nqdos, i1
+    complex (kind=dp) :: gflle(lmmaxd,lmmaxd,ielast,nqdos)
+    character (len=100) :: filename
+    integer :: ie
+    do ie = 1, ielast
+      write(filename, "(A,1I0.3,A,1I0.3,A)") "gllke.", I1, ".", IE, ".npy"
+      call save_npy(trim(filename), gflle(:,:,ie, :))
+    end do
+
+  end subroutine write_gflle_to_npy
+
+end module mod_write_gflle 
diff --git a/source/common/runoptions.F90 b/source/common/runoptions.F90
index df8995987389a42c5e6646a4b3088ed9afe2a800..09e112ac86c155c5be29b9243713a66252bf894a 100644
--- a/source/common/runoptions.F90
+++ b/source/common/runoptions.F90
@@ -25,6 +25,7 @@ module mod_runoptions
   logical :: calc_exchange_couplings = .false.         !!calculate magnetic exchange coupling parameters (former: 'XCPL')
   logical :: calc_exchange_couplings_energy = .false.  !!write energy-resolved Jij-files also if npol/=0 (former: 'Jijenerg')
   logical :: calc_gmat_lm_full = .false.               !!calculate all lm-lm components of systems greens function and store to file `gflle` (former: 'lmlm-dos')
+  logical :: gflle_to_npy = .false.                    !!write gflle file to npy instead of to gflle file (contains G(k,e)LL'
   logical :: dirac_scale_SpeefOfLight = .false.        !!scale the speed of light for Dirac solver (former: 'CSCALE')
   logical :: disable_charge_neutrality = .false.       !!no charge neutrailty required: leaving Fermi level unaffected (former: 'no-neutr')
   logical :: disable_print_serialnumber = .false.      !!deactivate writing of serial number and version information to files (for backwards compatibility) (former: 'noserial')
@@ -155,6 +156,7 @@ module mod_runoptions
     call set_runoption(write_lloyd_tralpha_file      , '<write_lloyd_tralpha_file>'      , '<wrttral>' )
     call set_runoption(write_lloyd_cdos_file         , '<write_lloyd_cdos_file>'         , '<wrtcdos>' )
     call set_runoption(calc_gmat_lm_full             , '<calc_gmat_lm_full>'             , '<lmlm-dos>')
+    call set_runoption(gflle_to_npy                  , '<gflle_to_npy>')
     call set_runoption(simulate_asa                  , '<simulate_asa>'                  , '<simulasa>')
     call set_runoption(use_readcpa                   , '<use_readcpa>'                   , '<readcpa>' )
     call set_runoption(print_kpoints                 , '<print_kpoints>'                 , '<BZKP>'    )
@@ -694,6 +696,7 @@ module mod_runoptions
     call mpi_bcast(write_lloyd_tralpha_file      , 1, mpi_logical, master, mpi_comm_world, ierr)
     call mpi_bcast(write_lloyd_cdos_file         , 1, mpi_logical, master, mpi_comm_world, ierr)
     call mpi_bcast(calc_gmat_lm_full             , 1, mpi_logical, master, mpi_comm_world, ierr)
+    call mpi_bcast(gflle_to_npy                  , 1, mpi_logical, master, mpi_comm_world, ierr)
     call mpi_bcast(simulate_asa                  , 1, mpi_logical, master, mpi_comm_world, ierr)
     call mpi_bcast(use_readcpa                   , 1, mpi_logical, master, mpi_comm_world, ierr)
     call mpi_bcast(print_kpoints                 , 1, mpi_logical, master, mpi_comm_world, ierr)
@@ -800,6 +803,7 @@ module mod_runoptions
     write(iounit, '(A35,1x,1L,3x,A)') '<calc_exchange_couplings>=', calc_exchange_couplings, "calculate magnetic exchange coupling parameters (former: 'XCPL')"
     write(iounit, '(A35,1x,1L,3x,A)') '<calc_exchange_couplings_energy>=', calc_exchange_couplings_energy, "write energy-resolved Jij-files also if npol/=0 (former: 'Jijenerg')"
     write(iounit, '(A35,1x,1L,3x,A)') '<calc_gmat_lm_full>=', calc_gmat_lm_full, "calculate all lm-lm components of systems greens function and store to file `gflle` (former: 'lmlm-dos')"
+    write(iounit, '(A35,1x,1L,3x,A)') '<gflle_to_npy>=', gflle_to_npy, "Write G_LL'(k,E) to npy files, one file per atom and energy"
     write(iounit, '(A35,1x,1L,3x,A)') '<dirac_scale_SpeefOfLight>=', dirac_scale_SpeefOfLight, "scale the speed of light for Dirac solver (former: 'CSCALE')"
     write(iounit, '(A35,1x,1L,3x,A)') '<disable_charge_neutrality>=', disable_charge_neutrality, "no charge neutrailty required: leaving Fermi level unaffected (former: 'no-neutr')"
     write(iounit, '(A35,1x,1L,3x,A)') '<disable_print_serialnumber>=', disable_print_serialnumber, "deactivate writing of serial number and version information to files (for backwards compatibility) (former: 'noserial')"