diff --git a/objects/ui2/worldMorph.self b/objects/ui2/worldMorph.self
old mode 100755
new mode 100644
index 36c13e0..5a9f6f5
--- a/objects/ui2/worldMorph.self
+++ b/objects/ui2/worldMorph.self
@@ -1,11 +1,11 @@
  '$Revision: 30.30 $'
  '
-Copyright 1992-2006 Sun Microsystems, Inc. and Stanford University.
+Copyright 1992-2009 AUTHORS, Sun Microsystems, Inc. and Stanford University.
 See the LICENSE file for license information.
 '
 
 
  '-- Module body'
 
  bootstrap addSlotsTo: bootstrap stub -> 'globals' -> 'memory' -> () From: ( | {
          'Category: releasing resources\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: public'
@@ -271,16 +271,22 @@ When I run again, the step cycle adds me in to the world.
 
  bootstrap addSlotsTo: bootstrap stub -> 'globals' -> 'worldMorph' -> () From: ( | {
          'Category: World Morph State\x7fModuleInfo: Module: worldMorph InitialContents: InitializeToExpression: (dictionary copyRemoveAll)\x7fVisibility: private'
         
          savedMorphs <- dictionary copyRemoveAll.
         } | ) 
 
  bootstrap addSlotsTo: bootstrap stub -> 'globals' -> 'worldMorph' -> () From: ( | {
+         'Category: World Morph State\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot'
+        
+         scrollStart.
+        } | ) 
+
+ bootstrap addSlotsTo: bootstrap stub -> 'globals' -> 'worldMorph' -> () From: ( | {
          'Category: World Morph State\x7fCategory: semaphores and processes\x7fModuleInfo: Module: worldMorph InitialContents: InitializeToExpression: (semaphore)\x7fVisibility: private'
         
          stepDoneSema <- bootstrap stub -> 'globals' -> 'semaphore' -> ().
         } | ) 
 
  bootstrap addSlotsTo: bootstrap stub -> 'globals' -> 'worldMorph' -> () From: ( | {
          'Category: World Morph State\x7fCategory: semaphores and processes\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: private'
         
@@ -1670,16 +1676,27 @@ Make a notifier to be spawned in a new world.\x7fModuleInfo: Module: worldMorph
                 a at: 2 Put: (a at: 2) copyFilteredBy: [|:m| m isInWorld].
                 l: l , (a at: 2).
               ].
             ].
             ^ l).
         } | ) 
 
  bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
+         'Category: event handling\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: public'
+        
+         mouseMove: evt = ( |
+            | 
+            evt rightIsDown ifTrue: [
+              moveHand: evt sourceHand InWorldBy: (scrollStart - (evt cursorPoint)).
+            ].
+            self).
+        } | ) 
+
+ bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
          'Category: moving around\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: public'
         
          moveHand: h InWorldBy: deltaPt = ( |
             | 
             "positive delta moves down/right"
             moveHand: h InWorldTo: h winCanvasForHand offset - deltaPt).
         } | ) 
 
@@ -1858,25 +1875,26 @@ oldGlobalBounds. \x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot'
         } | ) 
 
  bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
          'ModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: public'
         
          parent* = bootstrap stub -> 'traits' -> 'morph' -> ().
         } | ) 
 
-bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
+ bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
          'Category: window management\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot'
         
          platformSpecificNameFor: displayName = ( |
             | 
             host osName == 'macOSX' ifTrue: [^'quartz'].
             displayName == 'quartz' ifTrue: [^ ''].
             displayName).
         } | ) 
+
  bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
          'Category: structure\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: private'
         
          privateRemoveMorph: m IfPresentDo: b = ( |
             | 
             resend.privateRemoveMorph: m IfPresentDo: b.
             arrowsNeedSorting: true.
             self).
@@ -2231,16 +2249,37 @@ on the default display.\x7fModuleInfo: Module: worldMorph InitialContents: Follo
                         m changed.
                     ].
                 ] exit.
             ].
             self).
         } | ) 
 
  bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
+         'Category: event handling\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: public'
+        
+         rightMouseDown: evt = ( |
+            | 
+            rootMorphsAt: evt cursorPoint Do: [^ self].
+            evt sourceHand subscribeCursor: self.
+            scrollStart: evt cursorPoint.
+            self).
+        } | ) 
+
+ bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
+         'Category: event handling\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: public'
+        
+         rightMouseUp: evt = ( |
+            | 
+            evt sourceHand unsubscribeCursor: self.
+            scrollStart: nil.
+            self).
+        } | ) 
+
+ bootstrap addSlotsTo: bootstrap stub -> 'traits' -> 'worldMorph' -> () From: ( | {
          'Category: arrows\x7fModuleInfo: Module: worldMorph InitialContents: FollowSlot\x7fVisibility: private'
         
          rootMorphsAt: globalPt Do: blk = ( |
              level <- 0.
             | 
             world morphsDo: [| :m |
                 (m noStickOuts && [(m baseBounds includes: globalPt) not]) ifFalse: [
                     (m morphsAt: globalPt) isEmpty ifFalse: [ blk value: m With: level ].
