diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 6cb490efe..0c948d264 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -8,17 +8,18 @@ jobs:
     runs-on: ${{ matrix.os }}
     strategy:
       matrix:
-        os: [macOS-latest]
+        os: [macOS-12]
       fail-fast: true
     env:
       FC: gfortran
-      GCC_V: 13
+      GCC_V: 14
 
     steps:
     - name: Checkout code
       uses: actions/checkout@v2
 
     - name: Install Dependencies MacOS
+      if: contains(matrix.os, 'mac')
       run: |
         brew install gcc@${GCC_V}
         sudo ln -s $(which gfortran-${GCC_V}) $(dirname $(which gfortran-${GCC_V}))/gfortran
diff --git a/README.md b/README.md
index be127960b..2df205c2a 100644
--- a/README.md
+++ b/README.md
@@ -48,54 +48,41 @@ The available optimizers for training neural networks are
 1. Stochastic gradient descent
 2. Adam (recommended)
 
-Prerequisite
-------------
-Building Inference-Engine requires a Fortran 2018 compiler.  With `gfortran`, the required minimum compiler version is 13.
-
-Building and Testing
---------------------
+Build and Test
+--------------
+With the [Fortran Package Manager] (`fpm`) and a recent version of a Fortran compiler installed, enter one of the commmands below to build the Inference-Engine library and run the test suite:
 
 ### GNU (`gfortran`)
-#### macOS
-To build, and test Inference-Engine with `gfortran` in your `PATH` and your present working directory set to your 
-local copy of the `inference-engine` repository, enter the following commands in macOS Terminal window 
-(using the default `zsh` shell or `bash`):
-```
-./setup.sh
-```
-whereupon the trailing output will provide instructions for running the codes in the [example](./example) subdirectory.
-
-#### Linux (including the Windows Subsystem for Linux)
-The above `setup.sh` script assumes that you have either have `fpm` installed and or that the script can use Homebrew
-to install it.  If neither is true, please [install `fpm`] and then build and test Inference-Engine with the 
-following command:
 ```
 fpm test
 ```
 
-### Intel (`ifx`) -- under development
-As of this writing, `ifx` compiles all of Inference-Engine and all tests pass except tests involving training.
-We are working with Intel on supporting training with `ifx`.  If you would like to build Inference-Engine and
-run the tests,  please execute the following command
+### Intel (`ifx`)
 ```
-fpm test --compiler ifx --flag "-coarray -coarray-num-images=1"
+fpm test --compiler ifx
 ```
 
 #### _Experimental:_ Automatic offloading of `do concurrent` to GPUs
 This capability is under development with the goal to facilitate GPU automatic offloading via the following command:
 ```
-fpm test --compiler ifx --flag "-coarray -coarray-num-images=1 -fopenmp-target-do-concurrent -qopenmp -fopenmp-targets=spir64"
+fpm test --compiler ifx --flag "-fopenmp-target-do-concurrent -qopenmp -fopenmp-targets=spir64"
 ```
 
+### LLVM (`flang-new`)
+Support for LLVM `flang-new` is under development and currently requires building `flang-new` from source with assumed-rank support enabled:
+```
+fpm test --compiler flang-new --flag "-mmlir -allow-assumed-rank"
+```
+A script that might help with building `flang-new` from source is in the [handy-dandy] repository.
+
+
 ### NAG (`nagfor`) -- under development
-As of this writing, `nagfor` compiles all of Inference-Engine and passes only tests that involve neither inference nor training.
-We are working with NAG on supporting inference and training with `nagfor`.
 ```
-fpm test --compiler nagfor --flag "-fpp -f2018 -coarray=single"
+fpm test --compiler nagfor --flag -fpp
 ```
 
 ### HPE (`crayftn.sh`) -- under development
-As of this writing, the Cray Compiler Environment (CCE) Fortran compiler does not build Inference-Engine.
+Support for the Cray Compiler Environment (CCE) Fortran compiler is under development.
 Building with the CCE `ftn` compiler wrapper requires an additional trivial wrapper.
 With a shell script named `crayftn.sh` of the following form in your `PATH`
 ```
@@ -146,3 +133,5 @@ Please see the Inference-Engine GitHub Pages [site] for HTML documentation gener
 [sourcery]: https://github.com/sourceryinstitute/sourcery
 [rojff]: https://gitlab.com/everythingfunctional/rojff
 [install `fpm`]: https://fpm.fortran-lang.org/install/index.html#install
+[Fortran Package Manager]: https://github.com/fortran-lang/fpm
+[handy-dandy]: https://github.com/rouson/handy-dandy/blob/main/src/fresh-llvm-build.sh
diff --git a/example/concurrent-inferences.f90 b/example/concurrent-inferences.f90
index 65e35d0f8..e6aaef9da 100644
--- a/example/concurrent-inferences.f90
+++ b/example/concurrent-inferences.f90
@@ -4,7 +4,7 @@ program concurrent_inferences
   !! This program demonstrates how to read a neural network from a JSON file
   !! and use the network to perform concurrent inferences.
   use inference_engine_m, only : inference_engine_t, tensor_t, infer
-  use sourcery_m, only : string_t, command_line_t, file_t
+  use julienne_m, only : string_t, command_line_t, file_t
   use assert_m, only : assert
   use iso_fortran_env, only : int64, real64
   implicit none
diff --git a/example/learn-addition.F90 b/example/learn-addition.F90
index fd3acf643..8d5a35510 100644
--- a/example/learn-addition.F90
+++ b/example/learn-addition.F90
@@ -22,7 +22,7 @@ program learn_addition
   !! This trains a neural network to learn the following six polynomial functions of its eight inputs.
   use inference_engine_m, only : &
     inference_engine_t, trainable_engine_t, mini_batch_t, tensor_t, input_output_pair_t, shuffle, relu_t
-  use sourcery_m, only : string_t, file_t, command_line_t, bin_t
+  use julienne_m, only : string_t, file_t, command_line_t, bin_t
   use assert_m, only : assert, intrinsic_array_t
   use addition_m, only : y
   implicit none
@@ -84,7 +84,7 @@ program learn_addition
       block
         real, parameter :: tolerance = 1.E-06
         integer p
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
         type(tensor_t), allocatable :: network_outputs(:)
         network_outputs = trainable_engine%infer(inputs)
 #else
@@ -94,7 +94,8 @@ program learn_addition
           do p = 1, num_pairs
             print "(6G13.5, a1, 6G13.5)",network_outputs(p)%values(),       "|", desired_outputs(p)%values()
           end do
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
         end associate
 #endif
       end block
diff --git a/example/learn-exponentiation.F90 b/example/learn-exponentiation.F90
index 38c5875e1..9cdd0efba 100644
--- a/example/learn-exponentiation.F90
+++ b/example/learn-exponentiation.F90
@@ -22,7 +22,7 @@ program learn_exponentiation
   !! This trains a neural network to learn the following six polynomial functions of its eight inputs.
   use inference_engine_m, only : &
     inference_engine_t, trainable_engine_t, mini_batch_t, tensor_t, input_output_pair_t, shuffle, relu_t
-  use sourcery_m, only : string_t, file_t, command_line_t, bin_t
+  use julienne_m, only : string_t, file_t, command_line_t, bin_t
   use assert_m, only : assert, intrinsic_array_t
   use exponentiation_m, only : y
   implicit none
@@ -84,7 +84,7 @@ program learn_exponentiation
       block
         real, parameter :: tolerance = 1.E-06
         integer p
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
         type(tensor_t), allocatable :: network_outputs(:)
         network_outputs = trainable_engine%infer(inputs)
 #else
@@ -94,7 +94,8 @@ program learn_exponentiation
           do p = 1, num_pairs
             print "(6G13.5, a1, 6G13.5)",network_outputs(p)%values(),       "|", desired_outputs(p)%values()
           end do
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
         end associate
 #endif
       end block
diff --git a/example/learn-microphysics-procedures.F90 b/example/learn-microphysics-procedures.F90
index 8e051732d..fe4ac50e8 100644
--- a/example/learn-microphysics-procedures.F90
+++ b/example/learn-microphysics-procedures.F90
@@ -5,7 +5,7 @@ program learn_microphysics_procedures
   !! in of ICAR (https://github.com/BerkeleyLab/icar).
   use inference_engine_m, only : &
     inference_engine_t, trainable_engine_t, mini_batch_t, tensor_t, input_output_pair_t, shuffle, sigmoid_t 
-  use sourcery_m, only : string_t, file_t, command_line_t, bin_t, csv
+  use julienne_m, only : string_t, file_t, command_line_t, bin_t, csv
   use assert_m, only : assert, intrinsic_array_t
   use thompson_tensors_m, only : y, T, p
   use iso_fortran_env, only : int64, output_unit
@@ -120,7 +120,7 @@ program learn_microphysics_procedures
         report_network_performance: &
         block
           integer p
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
           type(tensor_t), allocatable :: network_outputs(:)
           network_outputs = trainable_engine%infer(inputs)
 #else
@@ -130,7 +130,8 @@ program learn_microphysics_procedures
             do p = 1, num_pairs
               print "(6(G13.5,2x))", inputs(p)%values(), network_outputs(p)%values(), desired_outputs(p)%values()
             end do
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
           end associate
 #endif
         end block report_network_performance
diff --git a/example/learn-multiplication.F90 b/example/learn-multiplication.F90
index cd20f9c22..0c6a8349d 100644
--- a/example/learn-multiplication.F90
+++ b/example/learn-multiplication.F90
@@ -22,7 +22,7 @@ program learn_multiplication
   !! This trains a neural network to learn the following six polynomial functions of its eight inputs.
   use inference_engine_m, only : &
     inference_engine_t, trainable_engine_t, mini_batch_t, tensor_t, input_output_pair_t, shuffle, relu_t
-  use sourcery_m, only : string_t, file_t, command_line_t, bin_t
+  use julienne_m, only : string_t, file_t, command_line_t, bin_t
   use assert_m, only : assert, intrinsic_array_t
   use multiply_inputs, only : y
   implicit none
@@ -84,7 +84,7 @@ program learn_multiplication
       block
         real, parameter :: tolerance = 1.E-06
         integer p
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
         type(tensor_t), allocatable :: network_outputs(:)
         network_outputs = trainable_engine%infer(inputs)
 #else
@@ -94,7 +94,8 @@ program learn_multiplication
           do p = 1, num_pairs
             print "(6G13.5, a1, 6G13.5)",network_outputs(p)%values(),       "|", desired_outputs(p)%values()
           end do
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
         end associate
 #endif
       end block
diff --git a/example/learn-power-series.F90 b/example/learn-power-series.F90
index d4cd553ae..e730fde1e 100644
--- a/example/learn-power-series.F90
+++ b/example/learn-power-series.F90
@@ -22,7 +22,7 @@ program learn_power_series
   !! This trains a neural network to learn the following six polynomial functions of its eight inputs.
   use inference_engine_m, only : &
     inference_engine_t, trainable_engine_t, mini_batch_t, tensor_t, input_output_pair_t, shuffle, relu_t
-  use sourcery_m, only : string_t, file_t, command_line_t, bin_t
+  use julienne_m, only : string_t, file_t, command_line_t, bin_t
   use assert_m, only : assert, intrinsic_array_t
   use power_series, only : y
   implicit none
@@ -86,7 +86,7 @@ program learn_power_series
       block
         real, parameter :: tolerance = 1.E-06
         integer p
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
         type(tensor_t), allocatable :: network_outputs(:)
         network_outputs = trainable_engine%infer(inputs)
 #else
@@ -96,7 +96,8 @@ program learn_power_series
           do p = 1, num_pairs
             print "(6G13.5, a1, 6G13.5)",network_outputs(p)%values(),       "|", desired_outputs(p)%values()
           end do
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
         end associate
 #endif
       end block
diff --git a/example/learn-saturated-mixing-ratio.F90 b/example/learn-saturated-mixing-ratio.F90
index fb4f47022..8546f697f 100644
--- a/example/learn-saturated-mixing-ratio.F90
+++ b/example/learn-saturated-mixing-ratio.F90
@@ -4,7 +4,7 @@ program train_saturated_mixture_ratio
   !! This program trains a neural network to learn the saturated mixing ratio function of ICAR.
   use inference_engine_m, only : &
     inference_engine_t, trainable_engine_t, mini_batch_t, tensor_t, input_output_pair_t, shuffle, relu_t
-  use sourcery_m, only : string_t, file_t, command_line_t, bin_t, csv
+  use julienne_m, only : string_t, file_t, command_line_t, bin_t, csv
   use assert_m, only : assert, intrinsic_array_t
   use saturated_mixing_ratio_m, only : y, T, p
   use iso_fortran_env, only : int64, output_unit
@@ -119,7 +119,7 @@ program train_saturated_mixture_ratio
         report_network_performance: &
         block
           integer p
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
           type(tensor_t), allocatable :: network_outputs(:)
           network_outputs = trainable_engine%infer(inputs)
 #else
@@ -129,7 +129,8 @@ program train_saturated_mixture_ratio
             do p = 1, num_pairs
               print "(4(G13.5,2x))", inputs(p)%values(), network_outputs(p)%values(), desired_outputs(p)%values()
             end do
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
           end associate
 #endif
         end block report_network_performance
diff --git a/example/print-training-configuration.F90 b/example/print-training-configuration.F90
index 9504a0410..6643318bd 100644
--- a/example/print-training-configuration.F90
+++ b/example/print-training-configuration.F90
@@ -1,7 +1,7 @@
 program print_training_configuration
   !! Demonstrate how to construct and print a training_configuration_t object
   use inference_engine_m, only : training_configuration_t, hyperparameters_t, network_configuration_t
-  use sourcery_m, only : file_t
+  use julienne_m, only : file_t
   implicit none
 #ifdef _CRAYFTN
   type(training_configuration_t) :: training_configuration
diff --git a/example/train-and-write.F90 b/example/train-and-write.F90
index d15888026..c12087e5e 100644
--- a/example/train-and-write.F90
+++ b/example/train-and-write.F90
@@ -10,7 +10,7 @@ program train_and_write
   !! that is uniformly distributed on the range [0,0.1].
   use inference_engine_m, only : &
     inference_engine_t, trainable_engine_t, mini_batch_t, tensor_t, input_output_pair_t, shuffle, relu_t
-  use sourcery_m, only : string_t, file_t, command_line_t, bin_t
+  use julienne_m, only : string_t, file_t, command_line_t, bin_t
   use assert_m, only : assert, intrinsic_array_t
   implicit none
 
@@ -72,7 +72,7 @@ program train_and_write
       block
         real, parameter :: tolerance = 1.E-06
         integer p
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
         type(tensor_t), allocatable :: network_outputs(:)
         network_outputs = trainable_engine%infer(inputs)
 #else
@@ -84,7 +84,8 @@ program train_and_write
           do p = 1, num_pairs
             print *,network_outputs(p)%values(),"|", inputs(p)%values(), "|",  network_outputs(p)%values() - inputs(p)%values()
           end do
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
         end associate
 #endif
       end block
diff --git a/example/write-read-infer.F90 b/example/write-read-infer.F90
index ff9688760..e6a7a907e 100644
--- a/example/write-read-infer.F90
+++ b/example/write-read-infer.F90
@@ -8,7 +8,7 @@ program write_read_infer
   !! non-negative inputs to the corresponding outputs using a RELU activation
   !! function.
   use inference_engine_m, only : inference_engine_t, relu_t, tensor_t
-  use sourcery_m, only : string_t, command_line_t, file_t
+  use julienne_m, only : string_t, command_line_t, file_t
   use kind_parameters_m, only : rkind
   implicit none
 
diff --git a/fpm.toml b/fpm.toml
index bcf0be690..eca2be014 100644
--- a/fpm.toml
+++ b/fpm.toml
@@ -5,5 +5,5 @@ author = "Damian Rouson, Tan Nguyen, Jordan Welsman, David Torres, Brad Richards
 maintainer = "rouson@lbl.gov"
 
 [dependencies]
-assert = {git = "https://github.com/sourceryinstitute/assert", tag = "1.6.0"}
-sourcery = {git = "https://github.com/sourceryinstitute/sourcery", tag = "4.8.1"}
+assert = {git = "https://github.com/sourceryinstitute/assert", tag = "1.7.0"}
+julienne = {git = "https://github.com/sourceryinstitute/julienne", tag = "2ca5c93e11b46395608fd00abbdf797d9be0b3d4"}
diff --git a/setup.sh b/setup.sh
index f270d4396..5908ce704 100755
--- a/setup.sh
+++ b/setup.sh
@@ -74,8 +74,8 @@ if ! command -v fpm > /dev/null ; then
   fi
 fi
 
-FPM_FC=${FC:-"gfortran-13"}
-FPM_CC=${CC:-"gcc-13"}
+FPM_FC=${FC:-"gfortran-14"}
+FPM_CC=${CC:-"gcc-14"}
 
 fpm test --profile release --flag "-fopenmp"
 
diff --git a/src/inference_engine/activation_strategy_m.f90 b/src/inference_engine/activation_strategy_m.f90
index 47cea20a4..ff2bffa4d 100644
--- a/src/inference_engine/activation_strategy_m.f90
+++ b/src/inference_engine/activation_strategy_m.f90
@@ -4,7 +4,7 @@ module activation_strategy_m
 
   ! External dependencies
   use kind_parameters_m, only : rkind
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   implicit none
 
   private
diff --git a/src/inference_engine/hyperparameters_m.f90 b/src/inference_engine/hyperparameters_m.f90
index 81ea3f6d8..9e55dc376 100644
--- a/src/inference_engine/hyperparameters_m.f90
+++ b/src/inference_engine/hyperparameters_m.f90
@@ -1,5 +1,5 @@
 module hyperparameters_m
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   use kind_parameters_m, only : rkind
   implicit none
 
diff --git a/src/inference_engine/inference_engine_m_.f90 b/src/inference_engine/inference_engine_m_.f90
index 9edc2af85..b4ea2bd29 100644
--- a/src/inference_engine/inference_engine_m_.f90
+++ b/src/inference_engine/inference_engine_m_.f90
@@ -3,8 +3,8 @@
 module inference_engine_m_
   !! Define an abstraction that supports inference operationsn on a neural network
   use activation_strategy_m, only : activation_strategy_t
-  use sourcery_file_m, only : file_t
-  use sourcery_string_m, only : string_t
+  use julienne_file_m, only : file_t
+  use julienne_string_m, only : string_t
   use kind_parameters_m, only : rkind
   use tensor_m, only : tensor_t
   use tensor_range_m, only : tensor_range_t
diff --git a/src/inference_engine/inference_engine_s.F90 b/src/inference_engine/inference_engine_s.F90
index ae7172833..5fddfef59 100644
--- a/src/inference_engine/inference_engine_s.F90
+++ b/src/inference_engine/inference_engine_s.F90
@@ -8,7 +8,7 @@
   use relu_m, only : relu_t
   use layer_m, only : layer_t
   use neuron_m, only : neuron_t
-  use sourcery_formats_m, only : separated_values
+  use julienne_formats_m, only : separated_values
   implicit none
 
   interface assert_consistency
diff --git a/src/inference_engine/layer_m.f90 b/src/inference_engine/layer_m.f90
index 55d6e2465..427fad7f6 100644
--- a/src/inference_engine/layer_m.f90
+++ b/src/inference_engine/layer_m.f90
@@ -2,7 +2,7 @@
 ! Terms of use are as specified in LICENSE.txt
 module layer_m
   use neuron_m, only : neuron_t
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   use kind_parameters_m, only : rkind
   use inference_engine_m_, only : inference_engine_t
   use tensor_range_m, only :  tensor_range_t
diff --git a/src/inference_engine/network_configuration_m.f90 b/src/inference_engine/network_configuration_m.f90
index 9872b0a8d..453c912d1 100644
--- a/src/inference_engine/network_configuration_m.f90
+++ b/src/inference_engine/network_configuration_m.f90
@@ -1,5 +1,5 @@
 module network_configuration_m
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   implicit none
 
   private
diff --git a/src/inference_engine/network_configuration_s.F90 b/src/inference_engine/network_configuration_s.F90
index 47536cc68..ef6ff7f69 100644
--- a/src/inference_engine/network_configuration_s.F90
+++ b/src/inference_engine/network_configuration_s.F90
@@ -1,6 +1,6 @@
 submodule(network_configuration_m) network_configuration_s
   use assert_m, only : assert
-  use sourcery_formats_m, only : csv
+  use julienne_formats_m, only : csv
   implicit none
 
   character(len=*), parameter :: skip_connections_key  = "skip connections"
diff --git a/src/inference_engine/neuron_m.f90 b/src/inference_engine/neuron_m.f90
index edba384f5..a0f416bf3 100644
--- a/src/inference_engine/neuron_m.f90
+++ b/src/inference_engine/neuron_m.f90
@@ -1,7 +1,7 @@
 ! Copyright (c), The Regents of the University of California
 ! Terms of use are as specified in LICENSE.txt
 module neuron_m
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   use kind_parameters_m, only : rkind
   implicit none
 
diff --git a/src/inference_engine/relu_m.f90 b/src/inference_engine/relu_m.f90
index 28ab5cef2..a303c1280 100644
--- a/src/inference_engine/relu_m.f90
+++ b/src/inference_engine/relu_m.f90
@@ -3,7 +3,7 @@
 module relu_m
   use differentiable_activation_strategy_m, only : differentiable_activation_strategy_t
   use kind_parameters_m, only : rkind
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   implicit none
 
   private
diff --git a/src/inference_engine/sigmoid_m.f90 b/src/inference_engine/sigmoid_m.f90
index bb31e3078..67f3a2fcb 100644
--- a/src/inference_engine/sigmoid_m.f90
+++ b/src/inference_engine/sigmoid_m.f90
@@ -3,7 +3,7 @@
 module sigmoid_m
   use differentiable_activation_strategy_m, only : differentiable_activation_strategy_t
   use kind_parameters_m, only : rkind
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   implicit none
 
   private
diff --git a/src/inference_engine/step_m.f90 b/src/inference_engine/step_m.f90
index a6d7f68e4..50f180f51 100644
--- a/src/inference_engine/step_m.f90
+++ b/src/inference_engine/step_m.f90
@@ -3,7 +3,7 @@
 module step_m
   use activation_strategy_m, only : activation_strategy_t
   use kind_parameters_m, only : rkind
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   implicit none
 
   private
diff --git a/src/inference_engine/swish_m.f90 b/src/inference_engine/swish_m.f90
index b626ea23f..993bcbf1d 100644
--- a/src/inference_engine/swish_m.f90
+++ b/src/inference_engine/swish_m.f90
@@ -3,7 +3,7 @@
 module swish_m
   use differentiable_activation_strategy_m, only : differentiable_activation_strategy_t
   use kind_parameters_m, only : rkind
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   implicit none
 
   private
diff --git a/src/inference_engine/tensor_range_m.f90 b/src/inference_engine/tensor_range_m.f90
index 4b6d069c4..70ad5b27b 100644
--- a/src/inference_engine/tensor_range_m.f90
+++ b/src/inference_engine/tensor_range_m.f90
@@ -2,7 +2,7 @@
 ! Terms of use are as specified in LICENSE.txt
 module tensor_range_m
   use tensor_m, only : tensor_t
-  use sourcery_m, only : string_t
+  use julienne_m, only : string_t
   implicit none
   
   private
diff --git a/src/inference_engine/tensor_range_s.f90 b/src/inference_engine/tensor_range_s.f90
index 58d4b6940..ce022a3e5 100644
--- a/src/inference_engine/tensor_range_s.f90
+++ b/src/inference_engine/tensor_range_s.f90
@@ -2,7 +2,7 @@
 ! Terms of use are as specified in LICENSE.txt
 submodule(tensor_range_m) tensor_range_s
   use assert_m, only : assert
-  use sourcery_m, only : separated_values
+  use julienne_m, only : separated_values
   use kind_parameters_m, only : rkind
   implicit none
   
diff --git a/src/inference_engine/trainable_engine_m.F90 b/src/inference_engine/trainable_engine_m.F90
index e508bfde3..763564ec6 100644
--- a/src/inference_engine/trainable_engine_m.F90
+++ b/src/inference_engine/trainable_engine_m.F90
@@ -2,7 +2,7 @@
 ! Terms of use are as specified in LICENSE.txt
 module trainable_engine_m
   !! Define an abstraction that supports training a neural network
-  use sourcery_string_m, only : string_t
+  use julienne_string_m, only : string_t
   use inference_engine_m_, only : inference_engine_t
   use differentiable_activation_strategy_m, only : differentiable_activation_strategy_t
   use kind_parameters_m, only : rkind
diff --git a/src/inference_engine/training_configuration_m.f90 b/src/inference_engine/training_configuration_m.f90
index 27db23645..7805675a3 100644
--- a/src/inference_engine/training_configuration_m.f90
+++ b/src/inference_engine/training_configuration_m.f90
@@ -1,6 +1,6 @@
 module training_configuration_m
-  use sourcery_string_m, only : string_t
-  use sourcery_file_m, only : file_t
+  use julienne_string_m, only : string_t
+  use julienne_file_m, only : file_t
   use hyperparameters_m, only : hyperparameters_t
   use network_configuration_m, only : network_configuration_t
   use kind_parameters_m, only  : rkind
diff --git a/test/asymmetric_engine_test_m.F90 b/test/asymmetric_engine_test_m.F90
index bf6a04f15..ee0d40e32 100644
--- a/test/asymmetric_engine_test_m.F90
+++ b/test/asymmetric_engine_test_m.F90
@@ -5,7 +5,7 @@ module asymmetric_engine_test_m
 
   ! External dependencies
   use assert_m, only : assert
-  use sourcery_m, only : &
+  use julienne_m, only : &
     test_t, test_result_t, vector_test_description_t, test_description_substring, string_t, vector_function_strategy_t
 
   ! Internal dependencies
diff --git a/test/hyperparameters_test_m.F90 b/test/hyperparameters_test_m.F90
index 31ce2dadc..2313c1c91 100644
--- a/test/hyperparameters_test_m.F90
+++ b/test/hyperparameters_test_m.F90
@@ -5,9 +5,9 @@ module hyperparameters_test_m
 
   ! External dependencies
   use inference_engine_m, only : hyperparameters_t
-  use sourcery_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t
+  use julienne_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t
 #ifdef __GFORTRAN__
-  use sourcery_m, only : test_function_i
+  use julienne_m, only : test_function_i
 #endif
 
   ! Internal dependencies
diff --git a/test/inference_engine_test_m.F90 b/test/inference_engine_test_m.F90
index d351842ee..341ce9269 100644
--- a/test/inference_engine_test_m.F90
+++ b/test/inference_engine_test_m.F90
@@ -6,9 +6,9 @@ module inference_engine_test_m
   ! External dependencies
   use assert_m, only : assert
   use kind_parameters_m, only : rkind
-  use sourcery_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, file_t
+  use julienne_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, file_t
 #ifdef __GFORTRAN__
-  use sourcery_m, only : test_function_i
+  use julienne_m, only : test_function_i
 #endif
 
   ! Internal dependencies
diff --git a/test/main.f90 b/test/main.f90
index 9b96d31d5..0ef4116be 100644
--- a/test/main.f90
+++ b/test/main.f90
@@ -8,7 +8,7 @@ program main
   use network_configuration_test_m, only : network_configuration_test_t
   use training_configuration_test_m, only : training_configuration_test_t
   use tensor_range_test_m, only : tensor_range_test_t
-  use sourcery_m, only : command_line_t
+  use julienne_m, only : command_line_t
   implicit none
 
   type(inference_engine_test_t) inference_engine_test
diff --git a/test/network_configuration_test_m.F90 b/test/network_configuration_test_m.F90
index 3696f8463..97e4e8a64 100644
--- a/test/network_configuration_test_m.F90
+++ b/test/network_configuration_test_m.F90
@@ -5,9 +5,9 @@ module network_configuration_test_m
 
   ! External dependencies
   use inference_engine_m, only : network_configuration_t
-  use sourcery_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, file_t
+  use julienne_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, file_t
 #ifdef __GFORTRAN__
-  use sourcery_m, only : test_function_i
+  use julienne_m, only : test_function_i
 #endif
 
   ! Internal dependencies
diff --git a/test/tensor_range_test_m.F90 b/test/tensor_range_test_m.F90
index bbd9cbb0d..2796781f2 100644
--- a/test/tensor_range_test_m.F90
+++ b/test/tensor_range_test_m.F90
@@ -5,10 +5,10 @@ module tensor_range_test_m
 
   ! External dependencies
   use assert_m, only : assert
-  use sourcery_m, only : string_t, test_t, test_result_t, test_description_t, test_description_substring, file_t
+  use julienne_m, only : string_t, test_t, test_result_t, test_description_t, test_description_substring, file_t
   use inference_engine_m, only : tensor_range_t, tensor_t
 #ifdef __GFORTRAN__
-  use sourcery_m, only : test_function_i
+  use julienne_m, only : test_function_i
 #endif
 
   ! Internal dependencies
diff --git a/test/trainable_engine_test_m.F90 b/test/trainable_engine_test_m.F90
index 9cedd3145..14af78302 100644
--- a/test/trainable_engine_test_m.F90
+++ b/test/trainable_engine_test_m.F90
@@ -5,10 +5,10 @@ module trainable_engine_test_m
 
   ! External dependencies
   use assert_m, only : assert, intrinsic_array_t
-  use sourcery_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, bin_t, &
+  use julienne_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, bin_t, &
     vector_test_description_t, vector_function_strategy_t
 #ifdef __GFORTRAN__
-  use sourcery_m, only : test_function_i
+  use julienne_m, only : test_function_i
 #endif
 
   ! Internal dependencies
@@ -466,14 +466,15 @@ function preserves_identity_mapping() result(test_passes)
 
       block
         real(rkind), parameter :: tolerance = 1.E-06
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
         type(tensor_t), allocatable :: network_outputs(:)
         network_outputs = trainable_engine%infer(inputs)
 #else
         associate(network_outputs => trainable_engine%infer(inputs))
 #endif
           test_passes = maxval(abs([(network_outputs(i)%values() - inputs(i)%values(), i=1,num_pairs)])) < tolerance
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
         end associate
 #endif
       end block
@@ -527,14 +528,15 @@ function perturbed_identity_converges() result(test_passes)
 
       block
         real(rkind), parameter :: tolerance = 1.E-06
-#ifdef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
         type(tensor_t), allocatable :: network_outputs(:)
         network_outputs = trainable_engine%infer(inputs)
 #else
         associate(network_outputs => trainable_engine%infer(inputs))
 #endif
           test_passes = maxval(abs([(network_outputs(i)%values() - inputs(i)%values(), i=1,num_pairs)])) < tolerance
-#ifndef _CRAYFTN
+#if defined _CRAYFTN || __GFORTRAN__
+#else
         end associate
 #endif
       end block
diff --git a/test/training_configuration_test_m.F90 b/test/training_configuration_test_m.F90
index 19d17b46a..13ed5ba2d 100644
--- a/test/training_configuration_test_m.F90
+++ b/test/training_configuration_test_m.F90
@@ -5,9 +5,9 @@ module training_configuration_test_m
 
   ! External dependencies
   use inference_engine_m, only : training_configuration_t, hyperparameters_t, network_configuration_t
-  use sourcery_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, file_t
+  use julienne_m, only : test_t, test_result_t, test_description_t, test_description_substring, string_t, file_t
 #ifdef __GFORTRAN__
-  use sourcery_m, only : test_function_i
+  use julienne_m, only : test_function_i
 #endif
 
   ! Internal dependencies
