diff --git a/serialdraw/serialdraw.py b/serialdraw/serialdraw.py
index aef0e21a568da58ac6d94dc6b950b6aab5f1b43e..c2ac7e5e0ddd9df68bfaaf0a54598af07e40b22f 100644
--- a/serialdraw/serialdraw.py
+++ b/serialdraw/serialdraw.py
@@ -17,6 +17,8 @@ import serial,signal,multiprocessing,os
 #
 forward = b'f'
 reverse = b'r'
+ports = []
+workers = []
 #
 # shared memory variables
 #
@@ -24,16 +26,58 @@ count0 = multiprocessing.Value('i',0,lock=False)
 #
 # event routines
 #
+# quit
+#
 def Quit():
    root.destroy()
-   pAlarm.terminate()
+   for w in workers:
+      w.terminate()
    sys.exit()
 #
+# open ports and start workers
+#
 def OpenPorts():
    print('open '+Port0Var.get()+' at '+BaudRateVar.get())
-   port = serial.Serial(Port0.get(),baudrate=int(BaudRate.get()),timeout=0)
+   Port0 = serial.Serial(Port0Var.get(),baudrate=int(BaudRateVar.get()),timeout=0)
+   ports.append(Port0)
+   #
+   AlarmProcess = multiprocessing.Process(target=AlarmWorker,args=(0,count0))
+   AlarmProcess.start()
+   workers.append(AlarmProcess)
+   #
    OpenButton.config(background='green')
 #
+# alarm worker
+#
+def AlarmWorker(id,count):
+   signal.signal(signal.SIGALRM,Alarm)
+   signal.setitimer(signal.ITIMER_REAL,float(StepTimeVar.get()),float(StepTimeVar.get()))
+   while (1):
+      0
+#
+def Alarm(signum,stack):
+   if (count0.value > 0):
+      count0.value -= 1
+      print(count0.value)
+#
+# motor 0 worker
+#
+def Worker0(id,count):
+   0
+#
+# start workers
+#
+'''
+p0 = multiprocessing.Process(target=Worker0,args=(0,count0))
+p0.start()
+p1 = multiprocessing.Process(target=worker1,args=(1,count))
+p1.start()
+p2 = multiprocessing.Process(target=worker2,args=(2,count))
+p2.start()
+p3 = multiprocessing.Process(target=worker3,args=(3,count))
+p3.start()
+'''
+#
 def Open1():
    print('open 1')
 #
@@ -76,22 +120,22 @@ Button(root,text='quit',command=Quit,bg='white').grid(column=1,row=row,padx=pad,
 row += 1
 Label(root,text='Steps/mm:',bg='white').grid(column=0,row=row,padx=pad)
 StepsPerMMVar = StringVar(root,'10')
-Entry(root,textvariable=StepsPerMM,width=15).grid(column=1,row=row,padx=pad,pady=pad)
+Entry(root,textvariable=StepsPerMMVar,width=15).grid(column=1,row=row,padx=pad,pady=pad)
 #
 row += 1
 Label(root,text='Jog steps:',bg='white').grid(column=0,row=row,padx=pad,pady=pad)
 JogStepsVar = StringVar(root,'100')
-Entry(root,textvariable=JogSteps,width=15).grid(column=1,row=row,padx=pad,pady=pad)
+Entry(root,textvariable=JogStepsVar,width=15).grid(column=1,row=row,padx=pad,pady=pad)
 #
 row += 1
 Label(root,text='Step time (s): ',bg='white').grid(column=0,row=row,padx=pad,pady=pad)
 StepTimeVar = StringVar(root,'0.001')
-Entry(root,textvariable=StepTime,width=15).grid(column=1,row=row,padx=pad,pady=pad)
+Entry(root,textvariable=StepTimeVar,width=15).grid(column=1,row=row,padx=pad,pady=pad)
 #
 row += 1
 Label(root,text='Baud Rate: ',bg='white').grid(column=0,row=row,padx=pad,pady=pad)
 BaudRateVar = StringVar(root,'0')
-Entry(root,textvariable=BaudRate,width=15).grid(column=1,row=row,padx=pad,pady=pad)
+Entry(root,textvariable=BaudRateVar,width=15).grid(column=1,row=row,padx=pad,pady=pad)
 #
 row += 1
 OpenButton = Button(root,text='Open Ports',command=OpenPorts,bg='white')
@@ -105,48 +149,17 @@ Label(root,text='Jog',bg='white').grid(column=2,row=row,columnspan=2,padx=pad,pa
 row += 1
 Label(root,text='0',bg='white').grid(column=0,row=row,padx=pad,pady=pad)
 Port0Var = StringVar(root,'/dev/ttyACM0')
-Entry(root,textvariable=Port0,width=15).grid(column=1,row=row,padx=pad,pady=pad)
+Entry(root,textvariable=Port0Var,width=15).grid(column=1,row=row,padx=pad,pady=pad)
 Button(root,text='CW',command=Jog0CW,bg='white').grid(column=2,row=row,padx=pad,pady=pad)
 Button(root,text='CCW',command=Jog0CCW,bg='white').grid(column=3,row=row,padx=pad,pady=pad)
 #
 row += 1
 Label(root,text='1',bg='white').grid(column=0,row=row,padx=pad,pady=pad)
 Port1Var = StringVar(root,'/dev/ttyACM1')
-Entry(root,textvariable=Port1,width=15).grid(column=1,row=row,padx=pad,pady=pad)
+Entry(root,textvariable=Port1Var,width=15).grid(column=1,row=row,padx=pad,pady=pad)
 Button(root,text='CW',command=Jog1CW,bg='white').grid(column=2,row=row,padx=pad,pady=pad)
 Button(root,text='CCW',command=Jog1CCW,bg='white').grid(column=3,row=row,padx=pad,pady=pad)
 #
-# worker event handlers
-#
-def AlarmWorker(id,count):
-   signal.signal(signal.SIGALRM,Alarm)
-   signal.setitimer(signal.ITIMER_REAL,float(StepTime.get()),float(StepTime.get()))
-   while (1):
-      0
-#
-def Alarm(signum,stack):
-   if (count0.value > 0):
-      count0.value -= 1
-      print(count0.value)
-#
-def Worker0(id,count):
-   0
-#
-# start workers
-#
-pAlarm = multiprocessing.Process(target=AlarmWorker,args=(0,count0))
-pAlarm.start()
-p0 = multiprocessing.Process(target=Worker0,args=(0,count0))
-p0.start()
-'''
-p1 = multiprocessing.Process(target=worker1,args=(1,count))
-p1.start()
-p2 = multiprocessing.Process(target=worker2,args=(2,count))
-p2.start()
-p3 = multiprocessing.Process(target=worker3,args=(3,count))
-p3.start()
-'''
-#
 # start mainloop and wait for alarms
 #
 root.mainloop()
diff --git a/serialstep/serialstep.1.py b/serialstep/serialstep.1.py
index eb4de2dfd34ebe2bb0b6b741a17d1bc1f46eed5a..ecd157df773ccfdb5f8327f2edb322cc9be160fe 100644
--- a/serialstep/serialstep.1.py
+++ b/serialstep/serialstep.1.py
@@ -20,10 +20,10 @@ print('open '+device+' at '+str(baud)+' delay '+str(delay))
 port = serial.Serial(device,baudrate=baud,timeout=0)
 count = 0;
 maxcount = 5000;
-forward = b'r'
-reverse = b'r'
 forward = b'f'
 reverse = b'f'
+forward = b'r'
+reverse = b'r'
 #
 # alarm handler
 #