diff --git a/nucleus/change.go b/nucleus/change.go
index 3fd4d7c0cb11b9166ab880eeebb83ff0ff977163..f64a99eaba5de7fa43ddcb52ff5adb6d14282a37 100644
--- a/nucleus/change.go
+++ b/nucleus/change.go
@@ -117,26 +117,27 @@ func stateManager(ch *Change, timeout time.Duration) (chan<- ppb.Change_State, <
 	stateOut := make(chan ppb.Change_State)
 	stateRequest := make(chan bool)
 	errChan := make(chan error)
-	ticker := time.NewTicker(timeout)
+	// create ticker and make it wait for 1 week
+	// workaround for delayed ticker start and ugly housekeeping
+	ticker := time.NewTicker(time.Hour * 7 * 24)
 
 	go func() {
 		state := ppb.Change_PENDING
 		for {
 			select {
 			case <-ticker.C:
-				// only roll back committed changes
-				if state == ppb.Change_COMMITTED {
-					err := ch.callback(ch.intendedState, ch.previousState)
-					if err != nil {
-						state = ppb.Change_INCONSISTENT
-						errChan <- err
-					}
-					errChan <- fmt.Errorf("change %v timed out", ch.cuid)
-					break
+				err := ch.callback(ch.intendedState, ch.previousState)
+				if err != nil {
+					state = ppb.Change_INCONSISTENT
+					errChan <- err
 				}
+				errChan <- fmt.Errorf("change %v timed out", ch.cuid)
+				break
 			case s := <-stateIn:
 				switch s {
 				case ppb.Change_COMMITTED:
+					// reset ticker to enable activate the change timeout
+					ticker.Reset(timeout)
 					err := ch.callback(ch.previousState, ch.intendedState)
 					if err != nil {
 						state = ppb.Change_INCONSISTENT