Index: c/src/exec/rtems/src/event.c
===================================================================
--- c/src/exec/rtems/src/event.c	(revision 7f6fab613a58b018dfe051b1dd2cca49a14c222b)
+++ c/src/exec/rtems/src/event.c	(revision a8cd94aa2393a969c94e041df33d781a8abba6b9)
@@ -171,5 +171,7 @@
   }
 
-  _Event_Sync = TRUE;
+  _Event_Sync       = TRUE;
+  _Event_Sync_state = EVENT_SYNC_NOTHING_HAPPENED;
+
   executing->Wait.option            = (unsigned32) option_set;
   executing->Wait.count             = (unsigned32) event_in;
@@ -177,5 +179,4 @@
 
   _ISR_Enable( level );
-  _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
 
   if ( ticks ) {
@@ -189,18 +190,21 @@
       &executing->Timer,
       ticks,
-      WATCHDOG_NO_ACTIVATE
+      WATCHDOG_ACTIVATE_NOW
     );
   }
+
+  _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
 
   _ISR_Disable( level );
   if ( _Event_Sync == TRUE ) {
     _Event_Sync = FALSE;
-    if ( ticks )
-      _Watchdog_Activate( &executing->Timer );
     _ISR_Enable( level );
     return;
   }
+  if ( _Event_Sync_state == EVENT_SYNC_TIMEOUT )
+    executing->Wait.return_code = RTEMS_TIMEOUT;
   _ISR_Enable( level );
-  (void) _Watchdog_Remove( &executing->Timer );
+  if ( ticks )
+    (void) _Watchdog_Remove( &executing->Timer );
   _Thread_Unblock( executing );
   return;
@@ -267,9 +271,9 @@
       }
     }
-    else if ( _Thread_Is_executing( the_thread ) && _Event_Sync == TRUE ) {
+    else if ( _Event_Sync == TRUE && _Thread_Is_executing( the_thread ) ) {
       if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
         api->pending_events = _Event_sets_Clear( pending_events,seized_events );
         *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
-        _Event_Sync = FALSE;
+        _Event_Sync_state = EVENT_SYNC_SATISFIED;
       }
     }
@@ -305,6 +309,11 @@
       break;
     case OBJECTS_LOCAL:
-      the_thread->Wait.return_code = RTEMS_TIMEOUT;
-      _Thread_Unblock( the_thread );
+      if ( _Event_Sync == TRUE && _Thread_Is_executing( the_thread ) ) {
+        if ( _Event_Sync_state != EVENT_SYNC_SATISFIED )
+          _Event_Sync_state = EVENT_SYNC_TIMEOUT;
+      } else {
+        the_thread->Wait.return_code = RTEMS_TIMEOUT;
+        _Thread_Unblock( the_thread );
+      }
       _Thread_Unnest_dispatch();
       break;
Index: cpukit/rtems/src/event.c
===================================================================
--- cpukit/rtems/src/event.c	(revision 7f6fab613a58b018dfe051b1dd2cca49a14c222b)
+++ cpukit/rtems/src/event.c	(revision a8cd94aa2393a969c94e041df33d781a8abba6b9)
@@ -171,5 +171,7 @@
   }
 
-  _Event_Sync = TRUE;
+  _Event_Sync       = TRUE;
+  _Event_Sync_state = EVENT_SYNC_NOTHING_HAPPENED;
+
   executing->Wait.option            = (unsigned32) option_set;
   executing->Wait.count             = (unsigned32) event_in;
@@ -177,5 +179,4 @@
 
   _ISR_Enable( level );
-  _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
 
   if ( ticks ) {
@@ -189,18 +190,21 @@
       &executing->Timer,
       ticks,
-      WATCHDOG_NO_ACTIVATE
+      WATCHDOG_ACTIVATE_NOW
     );
   }
+
+  _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
 
   _ISR_Disable( level );
   if ( _Event_Sync == TRUE ) {
     _Event_Sync = FALSE;
-    if ( ticks )
-      _Watchdog_Activate( &executing->Timer );
     _ISR_Enable( level );
     return;
   }
+  if ( _Event_Sync_state == EVENT_SYNC_TIMEOUT )
+    executing->Wait.return_code = RTEMS_TIMEOUT;
   _ISR_Enable( level );
-  (void) _Watchdog_Remove( &executing->Timer );
+  if ( ticks )
+    (void) _Watchdog_Remove( &executing->Timer );
   _Thread_Unblock( executing );
   return;
@@ -267,9 +271,9 @@
       }
     }
-    else if ( _Thread_Is_executing( the_thread ) && _Event_Sync == TRUE ) {
+    else if ( _Event_Sync == TRUE && _Thread_Is_executing( the_thread ) ) {
       if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
         api->pending_events = _Event_sets_Clear( pending_events,seized_events );
         *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
-        _Event_Sync = FALSE;
+        _Event_Sync_state = EVENT_SYNC_SATISFIED;
       }
     }
@@ -305,6 +309,11 @@
       break;
     case OBJECTS_LOCAL:
-      the_thread->Wait.return_code = RTEMS_TIMEOUT;
-      _Thread_Unblock( the_thread );
+      if ( _Event_Sync == TRUE && _Thread_Is_executing( the_thread ) ) {
+        if ( _Event_Sync_state != EVENT_SYNC_SATISFIED )
+          _Event_Sync_state = EVENT_SYNC_TIMEOUT;
+      } else {
+        the_thread->Wait.return_code = RTEMS_TIMEOUT;
+        _Thread_Unblock( the_thread );
+      }
       _Thread_Unnest_dispatch();
       break;
