I managed to add this block in old Scratch version, here is the tutorial. Arrows for turn pages. Text for paste (use Alt+V to paste in Scratch browser): ('when %m clicked' #P #-) forStopEvent | t1 t2 t3 | super initialize. self removeAllMorphs. t1 _ ScratchTranslator labelPartsFor: 'when %m clicked'. t2 _ StringMorph new contents: t1 first; font: (ScratchFrameMorph getFont: #Label); color: Color white. self addMorphBack: t2. t3 _ ImageMorph new form: (ScratchFrameMorph skinAt: #stopButton). self addMorphBack: t3. t2 _ t2 fullCopy contents: t1 second. self addMorphBack: t2. scriptNameMorph _ EventTitleMorph new eventName: 'Scratch-StopClicked'. self fixBlockLayout helpScreenName (self isKindOf: MouseClickEventHatMorph) ifTrue: [^ 'mouseclickHat']. (self isKindOf: KeyEventHatMorph) ifTrue: [^ 'keyHat']. self eventName = 'Scratch-StartClicked' ifTrue: [^ 'startHat']. self eventName = 'Scratch-StopClicked' ifTrue: [^ 'stopHat']. ^ 'broadcastHat' printHatNameOn: t1 | t2 | t2 _ self eventName. t2 = 'Scratch-StartClicked' ifTrue: [t1 nextPutAll: 'when green flag clicked'] ifFalse: [t2 = 'Scratch-StopClicked' ifTrue: [t1 nextPutAll: 'when stop button clicked'] ifFalse: [t1 nextPutAll: 'when I receive "' , t2 , '"']. [t1 nextPutAll: 'when I receive "' , t2 , '"']]. t1 cr #P hatBlockFromTuple: t1 receiver: t2 | t3 t4 t5 t6 | t3 _ Smalltalk at: t1 first. t4 _ t3 new scriptOwner: t2. t3 = EventHatMorph ifTrue: [t5 _ t1 at: 2. t5 = 'Scratch-StartClicked' ifTrue: [t4 forStartEvent; scriptOwner: t2] ifFalse: [t5 = 'Scratch-StopClicked' ifTrue: [t4 forStopEvent; scriptOwner: t2] ifFalse: [t4 eventName: t5]]]. t3 = KeyEventHatMorph ifTrue: [t4 choice: (t1 at: 2)]. t3 = WhenHatBlockMorph ifTrue: [(t1 at: 2) ~= false ifTrue: [t6 _ self blockFromTuple: (t1 at: 2) receiver: t2. t4 replaceArgMorph: t4 argMorph by: t6]]. ^ t4 hatBlockType: t1 | t2 t3 | 'E' = t1 ifTrue: [t3 _ ''. (t2 _ self ownerThatIsA: ScratchStageMorph) ifNotNil: [t3 _ t2 defaultEventName]. ^ EventHatMorph new scriptOwner: self; eventName: t3]. 'K' = t1 ifTrue: [^ KeyEventHatMorph new scriptOwner: self]. 'M' = t1 ifTrue: [^ MouseClickEventHatMorph new scriptOwner: self]. 'S' = t1 ifTrue: [^ EventHatMorph new forStartEvent scriptOwner: self]. 'P' = t1 ifTrue: [^ EventHatMorph new forStopEvent scriptOwner: self]. 'W' = t1 ifTrue: [^ WhenHatBlockMorph new scriptOwner: self] queueBroadcast: t1 self sessionInProgress ifFalse: [^ self]. (#('Scratch-KeyPressedEvent' 'Scratch-MouseClickEvent' 'Scratch-StartClicked' 'Scratch-StopClicked' ) includes: t1) ifTrue: [^ self]. outgoingBroadcasts add: t1 stopAll | t1 | World hands do: [:t2 | t2 newKeyboardFocus: nil; clearUnclaimedKeystrokes]. Sensor clearKeystate. SoundPlayer stopPlayingAll. self class stopSoundRecorder. self stopAllProcesses. self stopAsks. self deleteAllClones. self midiAllNotesOff. WeDoPlugin resetWeDo. self stopPlaying. self allMorphsDo: [:t3 | (t3 isKindOf: ScriptableScratchMorph) ifTrue: [t3 stopPlaying]]. (t1 _ self ownerThatIsA: ScratchFrameMorph) ifNotNil: [t1 scriptsPane allMorphsDo: [:t3 | (t3 respondsTo: ) ifTrue: [t3 stop]. (t3 respondsTo: :) ifTrue: [t3 litUp: false]]. World startSteppingSubmorphsOf: t1]. World startSteppingSubmorphsOf: self. self broadcastEventNamed: 'Scratch-StopClicked' with: 0