diff --git a/src/containers/building_blocks.jl b/src/containers/building_blocks.jl
index 4b59f4ba210678174b60e8ae0deb693e19e20472..7c3635ddfb6fbb6cecf50e613d02ff979fec244a 100644
--- a/src/containers/building_blocks.jl
+++ b/src/containers/building_blocks.jl
@@ -242,7 +242,7 @@ end
 
 function gradient_strength(bb::BaseBuildingBlock, time::Number)
     for (key, block) in waveform_sequence(bb)
-        if start_time(bb, key) <= time <= end_time(bb, key)
+        if (start_time(bb, key) <= time <= end_time(bb, key)) || (time ≈ end_time(bb, key))
             return gradient_strength(block, time - start_time(bb, key))
         end
     end
diff --git a/src/containers/linearise.jl b/src/containers/linearise.jl
index 530a987fb8cd55dbe967cb5b56699b16fa80b2a4..826c4de92c27a779f1ad35f714323cd12409e710 100644
--- a/src/containers/linearise.jl
+++ b/src/containers/linearise.jl
@@ -32,18 +32,32 @@ end
 
 
 function SequencePart(sequence::BaseSequence{N}, time1::Number, time2::Number) where {N}
+    if -1e-9 < time1 < 0.
+        time1 = 0.
+    end
+    if time2 > duration(sequence) && time2 ≈ duration(sequence)
+        time2 = duration(sequence)
+    end
     if !(0 <= time1 <= time2 <= duration(sequence))
         error("Sequence timings are out of bound")
     end
+    tmean = (time1 + time2) / 2
     for key in 1:N
-        if (end_time(sequence, key) > time1)
+        if (end_time(sequence, key) > tmean)
             return SequencePart(sequence[key], time1 - start_time(sequence, key), time2 - start_time(sequence, key))
         end
     end
 end
 
 function SequencePart(bb::BaseBuildingBlock, time1::Number, time2::Number)
+    if -1e-9 < time1 < 0.
+        time1 = 0.
+    end
+    if time2 > duration(bb) && time2 ≈ duration(bb)
+        time2 = duration(bb)
+    end
     if !(0 <= time1 <= time2 <= duration(bb))
+        @show bb time1 time2 duration(bb)
         error("Sequence timings are out of bound")
     end
 
@@ -80,12 +94,10 @@ The split times will include any time when:
 
 Continuous gradient waveforms or RF pulses might be split up further to ensure the linear approximations meet the required `precision` (see [`split_timestep`](@ref)).
 """
-function split_times(sequence::BaseSequence; precision=0.01)
+function split_times(sequence::BaseSequence{N}; precision=0.01) where {N}
     splits = Float64[]
-    start_time = 0.
-    for block in sequence
-        append!(splits, start_time .+ split_times(block; precision=precision))
-        start_time += duration(block)
+    for key in 1:N
+        append!(splits, start_time(sequence, key) .+ split_times(sequence[key]; precision=precision))
     end
     return sort(unique(splits))
 end