diff --git a/core/MarkovProcesses.jl b/core/MarkovProcesses.jl
index 08c2b4a5d208fab06321f6c498d554185fefafa3..4ae10bbef973bcd676c37a17fe4201c6ef979429 100644
--- a/core/MarkovProcesses.jl
+++ b/core/MarkovProcesses.jl
@@ -6,23 +6,23 @@ import Base: copy, getfield, getindex, lastindex, setindex!, getproperty, setpro
 import StaticArrays: SVector
 
 # Common types and constructors
-export Observations, AbstractTrajectory, Trajectory
+export Observations, AbstractTrajectory, Trajectory, SynchronizedTrajectory
+export Model, ContinuousTimeModel, SynchronizedModel
 export LHA, StateLHA, Edge
-export Model, ContinuousTimeModel, DiscreteTimeModel
 
 # Trajectory related methods
 export +, -, δ, dist_lp
 export get_obs_var, length_states, length_obs_var, get_state_from_time 
-export is_bounded, times, transitions
-export check_consistency, is_steadystate
+export isbounded, times, transitions
+export check_consistency, issteadystate, isaccepted
 
 # LHA related methods
 export init_state, next_state!, read_trajectory
-export load_automaton, get_index, get_value, length_var
+export load_automaton, get_index, get_value, length_var, isaccepted
 
 # Model related methods
 export simulate, set_param!, get_param, set_observed_var!
-export is_bounded, check_consistency
+export isbounded, isaccepted, check_consistency
 export load_model, get_module_path
 
 # Utils
diff --git a/core/_tests_simulate.jl b/core/_tests_simulate.jl
index 0fc7c4a0a10241fd1a80c71ce9abacd60a2a66a1..632b3ffdafee62b9136cd6b12806cf5687aed079 100644
--- a/core/_tests_simulate.jl
+++ b/core/_tests_simulate.jl
@@ -33,18 +33,18 @@ function _simulate_col(m::ContinuousTimeModel)
     # at time n+1
     xnplus1 = zeros(Int, m.d)
     tnplus1 = zeros(Float64, 1)
-    is_absorbing = (m.is_absorbing(m.p,xn))::Bool
-    while !is_absorbing && (tn <= m.time_bound)
+    isabsorbing = (m.isabsorbing(m.p,xn))::Bool
+    while !isabsorbing && (tn <= m.time_bound)
         m.f!(xnplus1, tnplus1, tr, xn, tn, m.p)
         full_values = hcat(full_values, xnplus1)
         push!(times, tnplus1[1])
         push!(transitions, tr[1])
         xn, tn = xnplus1, tnplus1[1]
         n += 1
-        is_absorbing = m.is_absorbing(m.p,xn)::Bool
+        isabsorbing = m.isabsorbing(m.p,xn)::Bool
     end
     values = @view full_values[m._g_idx,:] 
-    if is_bounded(m)
+    if isbounded(m)
         if times[end] > m.time_bound
             values[:, end] = values[:,end-1]
             times[end] = m.time_bound
@@ -67,18 +67,18 @@ function _simulate_row(m::ContinuousTimeModel)
     # at time n+1
     xnplus1 = zeros(Int, m.d)
     tnplus1 = zeros(Float64, 1)
-    is_absorbing = (m.is_absorbing(m.p,xn))::Bool
-    while !is_absorbing && (tn <= m.time_bound)
+    isabsorbing = (m.isabsorbing(m.p,xn))::Bool
+    while !isabsorbing && (tn <= m.time_bound)
         m.f!(xnplus1, tnplus1, tr, xn, tn, m.p)
         full_values = vcat(full_values, xnplus1)
         push!(times, tnplus1[1])
         push!(transitions, tr[1])
         xn, tn = xnplus1, tnplus1[1]
         n += 1
-        is_absorbing = m.is_absorbing(m.p,xn)::Bool
+        isabsorbing = m.isabsorbing(m.p,xn)::Bool
     end
     values = @view full_values[m._g_idx,:] 
-    if is_bounded(m)
+    if isbounded(m)
         if times[end] > m.time_bound
             values[:, end] = values[:,end-1]
             times[end] = m.time_bound
@@ -102,24 +102,24 @@ function _simulate_col_buffer(m::ContinuousTimeModel; buffer_size::Int = 5)
     mat_x = zeros(Int, m.d, buffer_size)
     l_t = zeros(Float64, buffer_size)
     l_tr = Vector{String}(undef, buffer_size)
-    is_absorbing = m.is_absorbing(m.p,xn)::Bool
-    while !is_absorbing && (tn <= m.time_bound)
+    isabsorbing = m.isabsorbing(m.p,xn)::Bool
+    while !isabsorbing && (tn <= m.time_bound)
         i = 0
-        while i < buffer_size && !is_absorbing && (tn <= m.time_bound)
+        while i < buffer_size && !isabsorbing && (tn <= m.time_bound)
             i += 1
             m.f!(mat_x, l_t, l_tr, i, xn, tn, m.p)
             xn = @view mat_x[:,i]
             tn = l_t[i]
-            is_absorbing = m.is_absorbing(m.p,xn)::Bool
+            isabsorbing = m.isabsorbing(m.p,xn)::Bool
         end
         full_values = hcat(full_values, @view mat_x[:,1:i])
         append!(times, @view l_t[1:i])
         append!(transitions,  @view l_tr[1:i])
         n += i
-        is_absorbing = m.is_absorbing(m.p,xn)::Bool
+        isabsorbing = m.isabsorbing(m.p,xn)::Bool
     end
     values = @view full_values[m._g_idx,:] 
-    if is_bounded(m)
+    if isbounded(m)
         if times[end] > m.time_bound
             values[:, end] = values[:,end-1]
             times[end] = m.time_bound
@@ -142,24 +142,24 @@ function _simulate_row_buffer(m::ContinuousTimeModel; buffer_size::Int = 5)
     mat_x = zeros(Int, buffer_size, m.d)
     l_t = zeros(Float64, buffer_size)
     l_tr = Vector{String}(undef, buffer_size)
-    is_absorbing = m.is_absorbing(m.p,xn)::Bool
-    while !is_absorbing && (tn <= m.time_bound)
+    isabsorbing = m.isabsorbing(m.p,xn)::Bool
+    while !isabsorbing && (tn <= m.time_bound)
         i = 0
-        while i < buffer_size && !is_absorbing && (tn <= m.time_bound)
+        while i < buffer_size && !isabsorbing && (tn <= m.time_bound)
             i += 1
             m.f!(mat_x, l_t, l_tr, i, xn, tn, m.p)
             xn = @view mat_x[i,:]
             tn = l_t[i]
-            is_absorbing = m.is_absorbing(m.p,xn)::Bool
+            isabsorbing = m.isabsorbing(m.p,xn)::Bool
         end
         full_values = vcat(full_values, @view mat_x[1:i,:])
         append!(times, @view l_t[1:i])
         append!(transitions,  @view l_tr[1:i])
         n += i
-        is_absorbing = m.is_absorbing(m.p,xn)::Bool
+        isabsorbing = m.isabsorbing(m.p,xn)::Bool
     end
     values = @view full_values[:,m._g_idx] 
-    if is_bounded(m)
+    if isbounded(m)
         if times[end] > m.time_bound
             values[end,:] = values[end-1,:]
             times[end] = m.time_bound
@@ -183,23 +183,23 @@ function _simulate_without_view(m::ContinuousTimeModel)
     mat_x = zeros(Int, m.buffer_size, m.d)
     l_t = zeros(Float64, m.buffer_size)
     l_tr = Vector{String}(undef, m.buffer_size)
-    is_absorbing = m.is_absorbing(m.p,xn)::Bool
-    while !is_absorbing && (tn <= m.time_bound)
+    isabsorbing = m.isabsorbing(m.p,xn)::Bool
+    while !isabsorbing && (tn <= m.time_bound)
         i = 0
-        while i < m.buffer_size && !is_absorbing && (tn <= m.time_bound)
+        while i < m.buffer_size && !isabsorbing && (tn <= m.time_bound)
             i += 1
             m.f!(mat_x, l_t, l_tr, i, @view(xn[:]), tn, m.p)
             xn = mat_x[i,:]
             tn = l_t[i]
-            is_absorbing = m.is_absorbing(m.p,@view(xn[:]))::Bool
+            isabsorbing = m.isabsorbing(m.p,@view(xn[:]))::Bool
         end
         full_values = vcat(full_values, mat_x[1:i,:])
         append!(times, l_t[1:i])
         append!(transitions,  l_tr[1:i])
         n += i
-        is_absorbing = m.is_absorbing(m.p,@view(xn[:]))::Bool
+        isabsorbing = m.isabsorbing(m.p,@view(xn[:]))::Bool
     end
-    if is_bounded(m)
+    if isbounded(m)
         if times[end] > m.time_bound
             full_values[end,:] = full_values[end-1,:]
             times[end] = m.time_bound
diff --git a/core/common.jl b/core/common.jl
index 2e9decc0d8d0da38fddee616f3f5496a33456441..bbe0914fd88844f07af51e5b0ab245e40ec42aa8 100644
--- a/core/common.jl
+++ b/core/common.jl
@@ -19,7 +19,7 @@ mutable struct ContinuousTimeModel <: Model
     f!::Function
     g::Vector{String} # of dimension dobs
     _g_idx::Vector{Int} # of dimension dobs
-    is_absorbing::Function
+    isabsorbing::Function
     time_bound::Float64
     buffer_size::Int
 end
@@ -57,15 +57,23 @@ mutable struct StateLHA
     time::Float64
 end
 
-mutable struct SynchronizedModel
+mutable struct SynchronizedModel <: Model
     m::ContinuousTimeModel
     automaton::LHA
 end
 
+struct SynchronizedTrajectory <: AbstractTrajectory
+    S::StateLHA
+    m::SynchronizedModel
+    values::Matrix{Int}
+    times::Vector{Float64}
+    transitions::Vector{Transition}
+end
+
 # Constructors
 function ContinuousTimeModel(d::Int, k::Int, map_var_idx::Dict, map_param_idx::Dict, l_transitions::Vector{String}, 
               p::Vector{Float64}, x0::Vector{Int}, t0::Float64, 
-              f!::Function, is_absorbing::Function; 
+              f!::Function, isabsorbing::Function; 
               g::Vector{String} = keys(map_var_idx), time_bound::Float64 = Inf, buffer_size::Int = 10)
     dobs = length(g)
     _map_obs_var_idx = Dict()
@@ -78,11 +86,11 @@ function ContinuousTimeModel(d::Int, k::Int, map_var_idx::Dict, map_param_idx::D
     if length(methods(f!)) >= 2
         @warn "You have possibly redefined a function Model.f! used in a previously instantiated model."
     end
-    if length(methods(is_absorbing)) >= 2
-        @warn "You have possibly redefined a function Model.is_absorbing used in a previously instantiated model."
+    if length(methods(isabsorbing)) >= 2
+        @warn "You have possibly redefined a function Model.isabsorbing used in a previously instantiated model."
     end
 
-    return ContinuousTimeModel(d, k, map_var_idx, _map_obs_var_idx, map_param_idx, l_transitions, p, x0, t0, f!, g, _g_idx, is_absorbing, time_bound, buffer_size)
+    return ContinuousTimeModel(d, k, map_var_idx, _map_obs_var_idx, map_param_idx, l_transitions, p, x0, t0, f!, g, _g_idx, isabsorbing, time_bound, buffer_size)
 end
 
 LHA(A::LHA, map_var::Dict{String,Int}) = LHA(A.l_transitions, A.l_loc, A.Λ, 
diff --git a/core/lha.jl b/core/lha.jl
index 3221688a35ad8f906ad4ce878d18ade16d814ae4..c0288d6ad340243e654afc6cca2375669dbc3176 100644
--- a/core/lha.jl
+++ b/core/lha.jl
@@ -19,7 +19,7 @@ function Base.show(io::IO, S::StateLHA)
     end
 end
 
-isaccepted(S::StateLHA) = S.loc in (S.A).l_loc_final
+isaccepted(S::StateLHA) = (S.loc in (S.A).l_loc_final)
 
 # Methods for synchronize / read the trajectory
 function init_state(A::LHA, x0::SubArray{Int,1}, t0::Float64)
diff --git a/core/model.jl b/core/model.jl
index 6824680f16338fca690c70a13d1b3aef32d06af4..03099d0a294d3b6a7f1c7f9df5cf446fa183a212 100644
--- a/core/model.jl
+++ b/core/model.jl
@@ -16,32 +16,38 @@ function simulate(m::ContinuousTimeModel)
     mat_x = zeros(Int, m.buffer_size, m.d)
     l_t = zeros(Float64, m.buffer_size)
     l_tr = Vector{String}(undef, m.buffer_size)
-    is_absorbing::Bool = m.is_absorbing(m.p,xn)
-    while !is_absorbing && (tn <= m.time_bound)
+    isabsorbing::Bool = m.isabsorbing(m.p,xn)
+    while !isabsorbing && tn <= m.time_bound
         i = 0
-        while i < m.buffer_size && !is_absorbing && (tn <= m.time_bound)
+        while i < m.buffer_size && !isabsorbing && tn <= m.time_bound
             i += 1
             m.f!(mat_x, l_t, l_tr, i, xn, tn, m.p)
-            xn = view(mat_x, i, :)
             tn = l_t[i]
-            is_absorbing = m.is_absorbing(m.p,xn)
+            if tn > m.time_bound
+                i -= 1 # 0 is an ok value, 1:0 is allowed
+                break
+            end
+            xn = view(mat_x, i, :)
+            isabsorbing = m.isabsorbing(m.p,xn)
         end
         full_values = vcat(full_values, view(mat_x, 1:i, :))
         append!(times, view(l_t, 1:i))
         append!(transitions,  view(l_tr, 1:i))
         n += i
-        is_absorbing = m.is_absorbing(m.p,xn)
+        #isabsorbing = m.isabsorbing(m.p,xn)
     end
-    if is_bounded(m)
+    if isbounded(m)
+        #=
         if times[end] > m.time_bound
             full_values[end,:] = full_values[end-1,:]
             times[end] = m.time_bound
             transitions[end] = nothing
         else
-            full_values = vcat(full_values, reshape(full_values[end,:], 1, m.d))
-            push!(times, m.time_bound)
-            push!(transitions, nothing)
         end
+        =#
+        full_values = vcat(full_values, reshape(full_values[end,:], 1, m.d))
+        push!(times, m.time_bound)
+        push!(transitions, nothing)
     end
     values = view(full_values, :, m._g_idx)
     return Trajectory(m, values, times, transitions)
@@ -56,7 +62,7 @@ function simulate(product::SynchronizedModel)
     times = Float64[m.t0]
     transitions = Union{String,Nothing}[nothing]
     reshaped_x0 = view(reshape(m.x0, 1, m.d), 1, :) # View for type stability
-    S0 = init_state(A, reshaped_x0, t0) 
+    S0 = init_state(A, reshaped_x0, m.t0) 
     # values at time n
     n = 0
     xn = reshaped_x0 
@@ -66,47 +72,44 @@ function simulate(product::SynchronizedModel)
     mat_x = zeros(Int, m.buffer_size, m.d)
     l_t = zeros(Float64, m.buffer_size)
     l_tr = Vector{String}(undef, m.buffer_size)
-    is_absorbing::Bool = m.is_absorbing(m.p,xn)
+    isabsorbing::Bool = m.isabsorbing(m.p,xn)
+    isacceptedLHA::Bool = isaccepted(Sn)
     Snplus1 = copy(Sn)
-    while !is_absorbing && (tn < m.time_bound)
+    Sn_dump = Sn
+    while !isabsorbing && tn <= m.time_bound && !isacceptedLHA
         i = 0
-        while i < m.buffer_size && !is_absorbing && (tn < m.time_bound)
+        while i < m.buffer_size && !isabsorbing && tn <= m.time_bound && !isacceptedLHA
             i += 1
             m.f!(mat_x, l_t, l_tr, i, xn, tn, m.p)
-            xn = view(mat_x, i, :)
             tn = l_t[i]
-            tr_n = l_tr[n]
-            A.next_state!(Snplus1, A, xn, tn, tr_n, Sn)
+            if tn > m.time_bound
+                i -= 1 # 0 is an ok value, 1:0 is allowed
+                break
+            end
+            xn = view(mat_x, i, :)
+            tr_n = l_tr[i]
+            next_state!(Snplus1, A, xn, tn, tr_n, Sn)
             Sn = Snplus1
-            is_absorbing = m.is_absorbing(m.p,xn)
+            isabsorbing = m.isabsorbing(m.p,xn)
+            isacceptedLHA = isaccepted(Snplus1)
         end
         full_values = vcat(full_values, view(mat_x, 1:i, :))
         append!(times, view(l_t, 1:i))
         append!(transitions,  view(l_tr, 1:i))
         n += i
-        is_absorbing = m.is_absorbing(m.p,xn)
     end
-    if is_bounded(m)
-        if times[end] > m.time_bound
-            full_values[end,:] = full_values[end-1,:]
-            times[end] = m.time_bound
-            transitions[end] = nothing
-        else
-            full_values = vcat(full_values, reshape(full_values[end,:], 1, m.d))
-            push!(times, m.time_bound)
-            push!(transitions, nothing)
-        end
+    # When the trajectory is accepted, we should not add an end value
+    if isbounded(m) && !isaccepted(Sn)
+        @assert times[end] < m.time_bound
+        #full_values = vcat(full_values, reshape(full_values[end,:], 1, m.d))
+        #push!(times, m.time_bound)
+        #push!(transitions, nothing)
     end
     values = view(full_values, :, m._g_idx)
-    return Trajectory(m, values, times, transitions)
+    return SynchronizedTrajectory(Snplus1, product, values, times, transitions)
 end
 
 function simulate(m::ContinuousTimeModel, n::Int)
-    obs = ContinuousObservations(undef, n)
-    for i = 1:n
-        obs[i] = simulate(m)
-    end
-    return obs
 end
 
 function set_observed_var!(m::Model,g::Vector{String})
@@ -122,7 +125,7 @@ function set_observed_var!(m::Model,g::Vector{String})
     m._map_obs_var_idx = _map_obs_var_idx
 end
 
-is_bounded(m::ContinuousTimeModel) = m.time_bound < Inf
+isbounded(m::ContinuousTimeModel) = m.time_bound < Inf
 function check_consistency(m::ContinuousTimeModel) 
     @assert m.d == length(m.map_var_idx) 
     @assert m.k == length(m.map_param_idx)
@@ -130,7 +133,7 @@ function check_consistency(m::ContinuousTimeModel)
     @assert length(m.g) <= m.d
     @assert length(m._g_idx) == length(m.g)
     @assert m.buffer_size >= 0
-    @assert typeof(m.is_absorbing(m.p, view(reshape(m.x0, 1, m.d), 1, :))) == Bool
+    @assert typeof(m.isabsorbing(m.p, view(reshape(m.x0, 1, m.d), 1, :))) == Bool
     return true
 end
 set_param!(m::ContinuousTimeModel, p::Vector{Float64}) = (m.p = p)
diff --git a/core/trajectory.jl b/core/trajectory.jl
index 32afb2947e56be934f11fe76bde59be3c0288131..cb8901babed4c938fb920864634443458b171c14 100644
--- a/core/trajectory.jl
+++ b/core/trajectory.jl
@@ -57,7 +57,7 @@ Requires `get_obs_var(σ1) == get_obs_var(σ2)`, it is verified if they are simu
 """
 function dist_lp(σ1::AbstractTrajectory, σ2::AbstractTrajectory, var::String; 
                  verbose::Bool = false, p::Int = 1)
-    if !is_bounded(σ1) || !is_bounded(σ2)
+    if !isbounded(σ1) || !isbounded(σ2)
         @warn "Lp distance computed on unbounded trajectories. Result should be wrong"
     end
     return dist_lp(σ1[var], times(σ1), σ2[var], times(σ2); verbose = false, p = p)
@@ -154,13 +154,14 @@ function check_consistency(σ::AbstractTrajectory)
     @assert length_obs_var(σ) == length(σ.m.g) == size(σ.values)[2]
     return true
 end
-is_steadystate(σ::AbstractTrajectory) = (σ.m).is_absorbing((σ.m).p, σ[end])
+issteadystate(σ::AbstractTrajectory) = (σ.m).isabsorbing((σ.m).p, σ[end])
 
 # Properties of the trajectory
 length_states(σ::AbstractTrajectory) = length(σ.times)
 length_obs_var(σ::AbstractTrajectory) = size(σ.values)[2]
 get_obs_var(σ::AbstractTrajectory) = (σ.m).g
-is_bounded(σ::AbstractTrajectory) = σ.transitions[end] == nothing 
+isbounded(σ::AbstractTrajectory) = σ.transitions[end] == nothing 
+isaccepted(σ::SynchronizedTrajectory) = isaccepted(σ.S)
 
 # Access to trajectory values
 get_var_values(σ::AbstractTrajectory, var::String) = view(σ.values, :, (σ.m)._map_obs_var_idx[var])
@@ -172,7 +173,7 @@ function get_state_from_time(σ::AbstractTrajectory, t::Float64)
     l_t = times(σ)
     if t == l_t[end] return σ[end] end
     if t > l_t[end]
-        if !is_bounded(σ)
+        if !isbounded(σ)
             return σ[end]
         else 
             error("This trajectory is bounded and you're accessing out of the bounds")
diff --git a/models/ER.jl b/models/ER.jl
index b427f08a050838e6dc3df89084b343b85a6b5d30..deace15ceccebd55fbdfb4d550b3ca867ce15cc4 100644
--- a/models/ER.jl
+++ b/models/ER.jl
@@ -41,10 +41,10 @@ function ER_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector{String}, i
     l_t[idx] = tn + tau
     l_tr[idx] = "R$(reaction)"
 end
-is_absorbing_ER(p::Vector{Float64},xn::SubArray{Int,1}) = 
+isabsorbing_ER(p::Vector{Float64},xn::SubArray{Int,1}) = 
     (p[1]*xn[1]*xn[2] + (p[2]+p[3])*xn[3]) === 0.0
 g_ER = ["P"]
 
-ER = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr_ER,p_ER,x0_ER,t0_ER,ER_f!,is_absorbing_ER; g=g_ER)
+ER = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr_ER,p_ER,x0_ER,t0_ER,ER_f!,isabsorbing_ER; g=g_ER)
 export ER
 
diff --git a/models/SIR.jl b/models/SIR.jl
index d3fff557a33a5c1c0127ecbabc876b576fce853a..37990bca6de67b84490b84e01964f55a4c23882f 100644
--- a/models/SIR.jl
+++ b/models/SIR.jl
@@ -41,9 +41,9 @@ function SIR_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector{String},
     l_t[idx] = tn + tau
     l_tr[idx] = "R$(reaction)"
 end
-is_absorbing_SIR(p::Vector{Float64}, xn::SubArray{Int,1}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
+isabsorbing_SIR(p::Vector{Float64}, xn::SubArray{Int,1}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
 g_SIR = ["I"]
 
-SIR = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr_SIR,p_SIR,x0_SIR,t0_SIR,SIR_f!,is_absorbing_SIR; g=g_SIR)
+SIR = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr_SIR,p_SIR,x0_SIR,t0_SIR,SIR_f!,isabsorbing_SIR; g=g_SIR)
 export SIR
 
diff --git a/models/_bench_perf_test/ER_col.jl b/models/_bench_perf_test/ER_col.jl
index 2546fd41d7434ea9ce918705d75c8c0f74969dab..e548336ac6a5a3da140e66ceabaf2703592d2e6b 100644
--- a/models/_bench_perf_test/ER_col.jl
+++ b/models/_bench_perf_test/ER_col.jl
@@ -42,10 +42,10 @@ function ER_col_f!(xnplus1::Vector{Int}, tnplus1::Vector{Float64}, tr::Vector{St
     tnplus1[1] = tn + tau
     tr[1] = "R$(reaction)"
 end
-is_absorbing_ER_col(p::Vector{Float64},xn::AbstractVector{Int}) = 
+isabsorbing_ER_col(p::Vector{Float64},xn::AbstractVector{Int}) = 
     (p[1]*xn[1]*xn[2] + (p[2]+p[3])*xn[3]) === 0.0
 g = ["P"]
 
-ER_col = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,ER_col_f!,is_absorbing_ER_col; g=g)
+ER_col = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,ER_col_f!,isabsorbing_ER_col; g=g)
 export ER_col
 
diff --git a/models/_bench_perf_test/ER_col_buffer.jl b/models/_bench_perf_test/ER_col_buffer.jl
index c7315c4e64b875868875bdb30273603fa6bc3e43..426127107523c469c69b4a751ef4ca9ba9de6279 100644
--- a/models/_bench_perf_test/ER_col_buffer.jl
+++ b/models/_bench_perf_test/ER_col_buffer.jl
@@ -41,10 +41,10 @@ function ER_col_buffer_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector
     l_t[idx] = tn + tau
     l_tr[idx] = "R$(reaction)"
 end
-is_absorbing_ER_col_buffer(p::Vector{Float64},xn::AbstractVector{Int}) = 
+isabsorbing_ER_col_buffer(p::Vector{Float64},xn::AbstractVector{Int}) = 
     (p[1]*xn[1]*xn[2] + (p[2]+p[3])*xn[3]) === 0.0
 g = ["P"]
 
-ER_col_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,ER_col_buffer_f!,is_absorbing_ER_col_buffer; g=g)
+ER_col_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,ER_col_buffer_f!,isabsorbing_ER_col_buffer; g=g)
 export ER_col_buffer
 
diff --git a/models/_bench_perf_test/ER_row_buffer.jl b/models/_bench_perf_test/ER_row_buffer.jl
index 5c1489d1093cdd6f8dc4fd08bfb2ffc336f21c6f..0fb918f1222781e5950b9684eb02dea7fb3d0ce1 100644
--- a/models/_bench_perf_test/ER_row_buffer.jl
+++ b/models/_bench_perf_test/ER_row_buffer.jl
@@ -41,10 +41,10 @@ function ER_row_buffer_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector
     l_t[idx] = tn + tau
     l_tr[idx] = "R$(reaction)"
 end
-is_absorbing_ER_row_buffer(p::Vector{Float64},xn::AbstractVector{Int}) = 
+isabsorbing_ER_row_buffer(p::Vector{Float64},xn::AbstractVector{Int}) = 
     (p[1]*xn[1]*xn[2] + (p[2]+p[3])*xn[3]) === 0.0
 g = ["P"]
 
-ER_row_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,ER_row_buffer_f!,is_absorbing_ER_row_buffer; g=g)
+ER_row_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,ER_row_buffer_f!,isabsorbing_ER_row_buffer; g=g)
 export ER_row_buffer
 
diff --git a/models/_bench_perf_test/SIR_col.jl b/models/_bench_perf_test/SIR_col.jl
index 3052b5e6b3a20238712d548d8b57c7b770fb35da..381a487f3fc6874a4fcd48012fd46fdd24ade348 100644
--- a/models/_bench_perf_test/SIR_col.jl
+++ b/models/_bench_perf_test/SIR_col.jl
@@ -41,9 +41,9 @@ function SIR_col_f!(xnplus1::Vector{Int}, tnplus1::Vector{Float64}, tr::Vector{S
     tnplus1[1] = tn + tau
     tr[1] = "R$(reaction)"
 end
-is_absorbing_SIR_col(p::Vector{Float64}, xn::AbstractVector{Int}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
+isabsorbing_SIR_col(p::Vector{Float64}, xn::AbstractVector{Int}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
 g = ["I"]
 
-SIR_col = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,SIR_col_f!,is_absorbing_SIR_col; g=g)
+SIR_col = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,SIR_col_f!,isabsorbing_SIR_col; g=g)
 export SIR_col
 
diff --git a/models/_bench_perf_test/SIR_col_buffer.jl b/models/_bench_perf_test/SIR_col_buffer.jl
index ee703931ed7a0b40708c2188b898ae9c3f431dba..771149d170cbe7109c54fe4150ac021e7323113e 100644
--- a/models/_bench_perf_test/SIR_col_buffer.jl
+++ b/models/_bench_perf_test/SIR_col_buffer.jl
@@ -41,9 +41,9 @@ function SIR_col_buffer_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vecto
     l_t[idx] = tn + tau
     l_tr[idx] = "R$(reaction)"
 end
-is_absorbing_SIR_col_buffer(p::Vector{Float64}, xn::AbstractVector{Int}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
+isabsorbing_SIR_col_buffer(p::Vector{Float64}, xn::AbstractVector{Int}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
 g = ["I"]
 
-SIR_col_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,SIR_col_buffer_f!,is_absorbing_SIR_col_buffer; g=g)
+SIR_col_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,SIR_col_buffer_f!,isabsorbing_SIR_col_buffer; g=g)
 export SIR_col_buffer
 
diff --git a/models/_bench_perf_test/SIR_row_buffer.jl b/models/_bench_perf_test/SIR_row_buffer.jl
index 4eaed57ebac6680c98ec4665abb7476990cf07ad..ee241e60708fc3968dff27c45f254338a7526507 100644
--- a/models/_bench_perf_test/SIR_row_buffer.jl
+++ b/models/_bench_perf_test/SIR_row_buffer.jl
@@ -41,9 +41,9 @@ function SIR_row_buffer_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vecto
     l_t[idx] = tn + tau
     l_tr[idx] = "R$(reaction)"
 end
-is_absorbing_SIR_row_buffer(p::Vector{Float64}, xn::AbstractVector{Int}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
+isabsorbing_SIR_row_buffer(p::Vector{Float64}, xn::AbstractVector{Int}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
 g = ["I"]
 
-SIR_row_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,SIR_row_buffer_f!,is_absorbing_SIR_row_buffer; g=g)
+SIR_row_buffer = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,SIR_row_buffer_f!,isabsorbing_SIR_row_buffer; g=g)
 export SIR_row_buffer
 
diff --git a/tests/automata/automaton_F.jl b/tests/automata/automaton_F.jl
deleted file mode 100644
index 145da95fe7e207b60ef9077b3ca1b2cb14131a26..0000000000000000000000000000000000000000
--- a/tests/automata/automaton_F.jl
+++ /dev/null
@@ -1,12 +0,0 @@
-
-using MarkovProcesses
-
-load_model("SIR")
-load_automaton("automaton_F")
-SIR.time_bound = 120.0
-x1, x2, t1, t2 = 0.0, Inf, 100.0, 120.0 
-A_F = create_automaton_F(SIR, x1, x2, t1, t2, "I") # <: LHA
-
-sync_SIR = SIR * A_F
-σ, state_lha = simulate(sync_SIR)  
-
diff --git a/tests/automata/sync_simulate_last_state_F.jl b/tests/automata/sync_simulate_last_state_F.jl
new file mode 100644
index 0000000000000000000000000000000000000000..7f65ae6f381759fc44e8c3149d0294742847c07e
--- /dev/null
+++ b/tests/automata/sync_simulate_last_state_F.jl
@@ -0,0 +1,26 @@
+
+using MarkovProcesses
+
+load_model("SIR")
+load_automaton("automaton_F")
+SIR.time_bound = 120.0
+x1, x2, t1, t2 = 0.0, Inf, 100.0, 120.0 
+
+A_F = create_automaton_F(SIR, x1, x2, t1, t2, "I") # <: LHA
+sync_SIR = A_F * SIR
+
+function test_last_state(A::LHA, m::SynchronizedModel)
+    σ = simulate(m)
+    test = (get_state_from_time(σ, (σ.S).time)[1] == (σ.S)["n"]) && ((σ.S)["d"] == 0)
+    return test
+end
+
+test_all = true
+nbr_sim = 10000
+for i = 1:nbr_sim
+    test = test_last_state(A_F, sync_SIR)
+    global test_all = test_all && test
+end
+
+return test_all
+
diff --git a/tests/run_automata.jl b/tests/run_automata.jl
index abec4d04c8ce02da9f18e5067be5dc6eceaf93d9..d0b38fd2ff4a292c7fe70613715afc866a72a3c4 100644
--- a/tests/run_automata.jl
+++ b/tests/run_automata.jl
@@ -3,5 +3,6 @@ using Test
 
 @testset "Automata tests" begin
     @test include("automata/read_trajectory_last_state_F.jl")
+    @test include("automata/sync_simulate_last_state_F.jl")
 end
 
diff --git a/tests/unit/is_always_bounded_sir.jl b/tests/unit/is_always_bounded_sir.jl
index 99b466182db8b586cf5f6458fcbd87dd51805024..7b478e061713b922bd44855e05461a7cb00f8e8c 100644
--- a/tests/unit/is_always_bounded_sir.jl
+++ b/tests/unit/is_always_bounded_sir.jl
@@ -6,7 +6,7 @@ load_model("SIR")
 SIR.time_bound = 120.0
 for i = 1:1000
     σ = simulate(SIR)
-    global test = test && is_bounded(σ)
+    global test = test && isbounded(σ)
 end
 
 return test
diff --git a/tests/unit/side_effects_1.jl b/tests/unit/side_effects_1.jl
index 3392843aa8b2e1ab203523557ebadb4ebd551e8d..cd45dfbe081dfe8614609d301d879e2f89a29dfb 100644
--- a/tests/unit/side_effects_1.jl
+++ b/tests/unit/side_effects_1.jl
@@ -10,7 +10,7 @@ test = SIR.map_var_idx !== ER.map_var_idx &&
        SIR.g !== ER.g &&
        SIR._g_idx !== ER._g_idx &&
        SIR.f! != ER.f! &&
-       SIR.is_absorbing != ER.is_absorbing
+       SIR.isabsorbing != ER.isabsorbing
 
 return test