diff --git a/src/components/gradient_waveforms/no_gradient_blocks.jl b/src/components/gradient_waveforms/no_gradient_blocks.jl
index 75fc5dc0a56b7abb59b09f7d3e09887c07c81628..6beb655a33680d39610b3f85213c738d9faf7095 100644
--- a/src/components/gradient_waveforms/no_gradient_blocks.jl
+++ b/src/components/gradient_waveforms/no_gradient_blocks.jl
@@ -23,7 +23,7 @@ struct NoGradient{N} <: GradientWaveform{N}
     end
 end
 
-duration(ngb::NoGradient) = duration(ngb)
+duration(ngb::NoGradient) = ngb.duration
 for func in (:qval, :gradient_strength, :slew_rate)
     @eval $func(::NoGradient{1}) = 0.
     @eval $func(::NoGradient{3}) = zero(SVector{3, Float64})
diff --git a/src/containers/building_blocks.jl b/src/containers/building_blocks.jl
index 244e11adf636f129affac310f66d3cfc8aa2cc15..0dcb4755c13771f55a332577abf9c492bc77f586 100644
--- a/src/containers/building_blocks.jl
+++ b/src/containers/building_blocks.jl
@@ -24,7 +24,6 @@ Main interface:
 Sub-types need to implement:
 - `Base.keys`: returns sequence of keys to all the components.
 - `Base.getindex`: returns the actual component for each key.
-- [`duration`](@ref): total duration of the building block.
 """
 abstract type BaseBuildingBlock <: ContainerBlock end
 
@@ -126,6 +125,8 @@ function start_time(building_block::BaseBuildingBlock, index)
     error("Building block with index '$index' not found")
 end
 
+duration(bb::BaseBuildingBlock) = sum([duration(wv) for (_, wv) in waveform_sequence(bb)])
+
 # Pathway support
 """
     waveform_sequence(building_block, first, last)
@@ -259,8 +260,6 @@ make_generic(other_block::BaseBuildingBlock) = BuildingBlock(duration(other_bloc
 Base.keys(bb::BuildingBlock) = 1:length(bb.parts)
 Base.getindex(bb::BuildingBlock, i::Integer) = bb.parts[i]
 
-duration(bb::BuildingBlock) = sum(duration, waveform_sequence(bb); init=0.)
-
 function get_pulse(bb::BuildingBlock)
     pulses = [p for p in events(bb) if p isa RFPulseComponent]
     if length(pulses) == 0