diff --git a/lib/wp/session-item.c b/lib/wp/session-item.c
index cfe5291018889eaedda2e416d3e6f5fb75317b7a..9d4937c3753fcb37f56228f1f78bcaef4e369fc2 100644
--- a/lib/wp/session-item.c
+++ b/lib/wp/session-item.c
@@ -64,6 +64,15 @@ wp_session_item_finalize (GObject * object)
   G_OBJECT_CLASS (wp_session_item_parent_class)->finalize (object);
 }
 
+static guint
+wp_session_item_default_get_next_step (WpSessionItem * self,
+    WpTransition * transition, guint step)
+{
+  /* the default implementation just activates instantly,
+     without taking any action */
+  return WP_TRANSITION_STEP_NONE;
+}
+
 static void
 wp_session_item_default_reset (WpSessionItem * self)
 {
@@ -84,6 +93,8 @@ wp_session_item_class_init (WpSessionItemClass * klass)
 
   klass->reset = wp_session_item_default_reset;
 
+  klass->get_next_step = wp_session_item_default_get_next_step;
+
   /**
    * WpSessionItem::flags-changed:
    * @self: the session item
@@ -231,12 +242,15 @@ wp_si_transition_get_next_step (WpTransition * transition, guint step)
   g_return_val_if_fail (
       WP_SESSION_ITEM_GET_CLASS (item)->get_next_step,
       WP_TRANSITION_STEP_ERROR);
+
+  step = WP_SESSION_ITEM_GET_CLASS (item)->get_next_step (item,
+      transition, step);
+
   g_return_val_if_fail (
+      step == WP_TRANSITION_STEP_NONE ||
       WP_SESSION_ITEM_GET_CLASS (item)->execute_step,
       WP_TRANSITION_STEP_ERROR);
-
-  return WP_SESSION_ITEM_GET_CLASS (item)->get_next_step (item,
-      transition, step);
+  return step;
 }
 
 static void