diff --git a/A2OSX.BUILD.HDV b/A2OSX.BUILD.HDV
index ce9b7e05..bc3b69b3 100644
Binary files a/A2OSX.BUILD.HDV and b/A2OSX.BUILD.HDV differ
diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt
index d650d964..debf90fc 100644
--- a/A2osX.STARTUP.txt
+++ b/A2osX.STARTUP.txt
@@ -19,5 +19,6 @@ EXEC DHCPCLNT
 *MOUNT TFTP 192.168.1.5:/AO2SX /TFTP
 LOAD DHGR.DRV
 LOAD MOUSE.DRV
+EXEC GUI
 MAN
 TEXT A2OSX.STARTUP
diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt
index e154d776..b84ee5ba 100644
--- a/DRV/CONSOLE.DRV.S.txt
+++ b/DRV/CONSOLE.DRV.S.txt
@@ -63,6 +63,9 @@ OPEN			stz CURON
 .8				lda A2osX.SCREENS
 				ora #A2osX.SCREENS.C
 				sta A2osX.SCREENS
+
+				lda #A2osX.SCREENS.C
+				>SYSCALL SYS.ScreenSelectA
 				
 				clc
 				rts
@@ -298,7 +301,11 @@ SetCharAtXY		pha
 .4				sta CLRPAGE2
 				rts	
 *--------------------------------------
-GetCharAtXY		sta SET80STORE
+GetCharAtXY		lda RDPAGE2
+				pha
+				lda RD80STORE
+				pha
+				sta SET80STORE
 				txa
 				lsr
 
@@ -314,7 +321,19 @@ GetCharAtXY		sta SET80STORE
 				sta ZPBASL1+1
 
 				lda (ZPBASL1)
+				
+				plx
+				bmi .3
+				sta CLR80STORE
+				
+.3				plx
+				bpl .4
+
+				sta SETPAGE2
 				rts
+
+.4				sta CLRPAGE2
+				rts	
 *--------------------------------------
 CS.END
 DEVNAME			>PSTRING "CON"
diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt
index 2b0f6818..86ecc845 100644
--- a/DRV/DHGR.DRV.S.txt
+++ b/DRV/DHGR.DRV.S.txt
@@ -46,8 +46,7 @@ L.DEVINFO		.DA DEVINFO
 				.DA CS.END-CS.START		Code Length To Relocate
 				.DA DS.END-DS.START		Data Segment to Allocate
 *--------------------------------------
-OPEN			
-				lda #S.DEV.F.GFX
+OPEN			lda #S.DEV.F.GFX
 				sta (pDevContext)
 				
 				ldy #S.DEV.NAME
@@ -60,10 +59,68 @@ OPEN
 				iny
 				bne .1
 				
+			
 .8				lda A2osX.SCREENS
 				ora #A2osX.SCREENS.G
 				sta A2osX.SCREENS
 				
+				lda #A2osX.SCREENS.G
+				>SYSCALL SYS.ScreenSelectA
+				
+				sta SET80STORE
+				ldx #192
+				
+.81				dex
+
+				lda BASEL,x
+				sta ZPBASE
+				lda BASEH,x
+				sta ZPBASE+1
+
+				lda #$D5
+				
+				ldy #39
+				sta SETPAGE2
+.82				sta (ZPBASE),y
+				dey
+				bpl .82
+
+				lda #$AA
+				
+				ldy #39
+				sta CLRPAGE2
+.83				sta (ZPBASE),y
+				dey
+				bpl .83
+				
+				dex
+				
+				lda BASEL,x
+				sta ZPBASE
+				lda BASEH,x
+				sta ZPBASE+1
+
+				lda #$2A
+				
+				ldy #39
+				sta SETPAGE2
+.84				sta (ZPBASE),y
+				dey
+				bpl .84
+
+				lda #$55
+
+				ldy #39
+				sta CLRPAGE2
+.85				sta (ZPBASE),y
+				dey
+				bpl .85
+				
+				txa
+				bne .81
+				
+				>DEBUG
+				
 				clc
 				rts
 *--------------------------------------
@@ -87,9 +144,9 @@ GETINFO			>LDYA L.DEVINFO
 * PULLB = X.HI
 * PULLB = Y
 * PULLB = Mode
-*		00000000=mono
-*		00000001=xor (mono on 1 bit)
-*		10000000=color
+*		00000001=mono
+*		00000010=16 colors
+*		1000000=xor (mono on 1 bit)
 * PULLB = Color	(if not xor)
 *--------------------------------------
 SETPIXEL		>PULLA					X.LO
@@ -99,18 +156,15 @@ SETPIXEL		>PULLA					X.LO
 				bcs .1
 				lsr
 				bcs	.2					if 512 < x
-				lda DIV7.0,x
-				tay
+				ldy DIV7.0,x
 				lda MOD7.0,x
 				bra .3
 				
-.1				lda DIV7.256,x
-				tay
+.1				ldy DIV7.256,x
 				lda MOD7.256,x
 				bra .3
 
-.2				lda DIV7.512,x
-				tay
+.2				ldy DIV7.512,x
 				lda MOD7.512,x
 
 .3				pha						save MOD,y=DIV
@@ -123,15 +177,29 @@ SETPIXEL		>PULLA					X.LO
 				sta ZPBASE+1
 
 				sta SET80STORE			and prepare for page switching
-				
+				sta SETHIRES
 				plx						get back MOD in x
 
 				>PULLA					Pull Mode
-				bmi SETPIXEL.COLOR
+				and #$FF
+				bpl SETPIXEL.SOLID
+
+SETPIXEL.XOR	tya
+				lsr
+				tay
+				bcs .1					odd=main ram
+				sta SETPAGE2
+				bra .2
+.1				sta CLRPAGE2
+.2				lda (ZPBASE),y
+				eor Mono.Masks,x
+				sta (ZPBASE),y
+				rts
 *--------------------------------------
-* X=MOD,Y=DIV
+* A=Mode,X=MOD,Y=DIV
 *--------------------------------------
-SETPIXEL.MONO	pha
+SETPIXEL.SOLID	dec
+				bne  SETPIXEL.COLOR
 				tya
 				lsr
 				tay
@@ -139,29 +207,21 @@ SETPIXEL.MONO	pha
 				sta SETPAGE2
 				bra .2
 .1				sta CLRPAGE2
-.2				pla
-				lsr						CS=xor
-				bcs SETPIXEL.MONOX
-				
-				>PULLA					get COLOR
+			
+.2				>PULLA					get COLOR
 				lsr 
-				bcs SETPIXEL.MONOW
+				bcs .3					set white pixel
 
 				lda (ZPBASE),y
-				and Mono.NMasks,x
+				and Mono.NMasks,x		includes And $7F for mono 
 				sta (ZPBASE),y
 				rts
 				
-SETPIXEL.MONOW	lda (ZPBASE),y
-				and #$7F				switch back ths byte to mono
+.3				lda (ZPBASE),y
+				and #$7F				switch back this byte to mono
 				ora Mono.Masks,x
 				sta (ZPBASE),y
 				rts
-
-SETPIXEL.MONOX	lda (ZPBASE),y
-				eor Mono.Masks,x
-				sta (ZPBASE),y
-				rts
 *--------------------------------------
 * X=MOD,Y=DIV
 *--------------------------------------
@@ -245,8 +305,7 @@ FILLREC
 BITBLT
 				rts
 *--------------------------------------
-*				PRIVATE
-*--------------------------------------
+CS.END
 DIV7.0			.HS 0000000000000001010101010101
 				.HS 0202020202020203030303030303
 				.HS 0404040404040405050505050505
@@ -383,71 +442,71 @@ BASEH			.HS	20.24.28.2C.30.34.38.3C
 				.HS	23.27.2B.2F.33.37.3B.3F
 				.HS	23.27.2B.2F.33.37.3B.3F
 *--------------------------------------
-Mono.NMasks		.DA %01111110
-				.DA %01111101
-				.DA %01111011
-				.DA %01110111
-				.DA %01101111
-				.DA %01011111
-				.DA %00111111
+Mono.NMasks		.DA #%01111110
+				.DA #%01111101
+				.DA #%01111011
+				.DA #%01110111
+				.DA #%01101111
+				.DA #%01011111
+				.DA #%00111111
 *--------------------------------------
-Mono.Masks		.DA	%00000001
-				.DA %00000010
-				.DA %00000100
-				.DA %00001000
-				.DA %00010000
-				.DA %00100000
-				.DA %01000000
+Mono.Masks		.DA	#%00000001
+				.DA #%00000010
+				.DA #%00000100
+				.DA #%00001000
+				.DA #%00010000
+				.DA #%00100000
+				.DA #%01000000
 *--------------------------------------
 * bits to "and"	to reset color of pixel (0 means nothing to do)
 *--------------------------------------
-Color.NMasks	.DA %01110000.00000000.00000000.00000000
-				.DA %00001111.01111110.00000000.00000000
-				.DA %00000000.01100001.00000000.00000000
-				.DA %00000000.00011111.01111100.00000000
-				.DA %00000000.00000000.01000011.00000000
-				.DA %00000000.00000000.00111111.01111000
-				.DA %00000000.00000000.00000000.00000111
+Color.NMasks	.DA #%01110000,#%00000000,#%00000000,#%00000000
+				.DA #%00001111,#%01111110,#%00000000,#%00000000
+				.DA #%00000000,#%01100001,#%00000000,#%00000000
+				.DA #%00000000,#%00011111,#%01111100,#%00000000
+				.DA #%00000000,#%00000000,#%01000011,#%00000000
+				.DA #%00000000,#%00000000,#%00111111,#%01111000
+				.DA #%00000000,#%00000000,#%00000000,#%00000111
 *--------------------------------------
 * bits to "and"	to Get color of pixel (0 means nothing to do)
 * 4 bytes * 7 mods
 *--------------------------------------
-Color.Masks		.DA %00001111.00000000.00000000.00000000	(nothing to do)
-				.DA %01110000.00000001.00000000.00000000	asl0,asl0,rol1,asl0,rol1,asl0,rol1
-				.DA %00000000.00011110.00000000.00000000	lsr1
-				.DA %00000000.01100000.00000011.00000000	asl1,asl1,rol2,asl1,rol2
-				.DA %00000000.00000000.00111100.00000000	lsr2,lsr2
-				.DA %00000000.00000000.01000000.00000111	asl2,asl2,rol3
-				.DA %00000000.00000000.00000000.01111000	lsr3,lsr3,lsr3	
+Color.Masks		.DA #%00001111,#%00000000,#%00000000,#%00000000	(nothing to do)
+				.DA #%01110000,#%00000001,#%00000000,#%00000000	asl0,asl0,rol1,asl0,rol1,asl0,rol1
+				.DA #%00000000,#%00011110,#%00000000,#%00000000	lsr1
+				.DA #%00000000,#%01100000,#%00000011,#%00000000	asl1,asl1,rol2,asl1,rol2
+				.DA #%00000000,#%00000000,#%00111100,#%00000000	lsr2,lsr2
+				.DA #%00000000,#%00000000,#%01000000,#%00000111	asl2,asl2,rol3
+				.DA #%00000000,#%00000000,#%00000000,#%01111000	lsr3,lsr3,lsr3	
 *--------------------------------------
-Color.Enable	.DA %10001111.00000000.00000000.00000000
-				.DA %11110000.00000001.00000000.00000000
-				.DA %00000000.10011110.00000000.00000000
-				.DA %00000000.11100000.00000011.00000000
-				.DA %00000000.00000000.10111100.00000000
-				.DA %00000000.00000000.11000000.00000111
-				.DA %00000000.00000000.00000000.11111000
+Color.Enable	.DA #%10001111,#%00000000,#%00000000,#%00000000
+				.DA #%11110000,#%00000001,#%00000000,#%00000000
+				.DA #%00000000,#%10011110,#%00000000,#%00000000
+				.DA #%00000000,#%11100000,#%00000011,#%00000000
+				.DA #%00000000,#%00000000,#%10111100,#%00000000
+				.DA #%00000000,#%00000000,#%11000000,#%00000111
+				.DA #%00000000,#%00000000,#%00000000,#%11111000
 *--------------------------------------
 * bits to "ora" to set color of pixel (including "color bit set " for byte hosting bit0)
 * 4 bytes * 16 Colors
 * pixel masks		 c1110000.c3322221.c5444433.c6666555    
 *--------------------------------------
-Color.Pixels	.DA %00000000.00000000.00000000.00000000	0000,Black (color bit disable)
-				.DA %10010001.10100010.11000100.10001000	0001,Magenta
-				.DA %10100010.11000100.10001000.10010001	0010,Brown
-				.DA %10110011.11100110.11001100.10011001	0011,Orange
-				.DA %11000100.10001000.10010001.10100010	0100,Dark Green
-				.DA %11010101.10101010.11010101.10101010	0101,Grey1
-				.DA %11100110.11001100.10011001.10110011	0110,Green
-				.DA %11110111.11101110.11011101.10111011	0111,Yellow
-				.DA %10001000.10010001.10100010.11000100	1000,Dark Blue
-				.DA %10011001.10110011.11100110.11001100	1001,Violet
-				.DA %10101010.11010101.10101010.11010101	1010,Grey2
-				.DA %10111011.11110111.11101111.11011101	1011,Pink
-				.DA %11001100.10011001.10110011.11100110	1100,Medium Blue
-				.DA %11011101.10111011.11110111.11101110	1101,Light Blue
-				.DA %11101110.11011101.10111011.11110111	1110,Aqua
-				.DA %01111111.01111111.01111111.01111111	1111,White (color bit disable)
+Color.Pixels	.DA #%00000000,#%00000000,#%00000000,#%00000000	(color bit disable)
+				.DA #%10010001,#%10100010,#%11000100,#%10001000	
+				.DA #%10100010,#%11000100,#%10001000,#%10010001	
+				.DA #%10110011,#%11100110,#%11001100,#%10011001	
+				.DA #%11000100,#%10001000,#%10010001,#%10100010	
+				.DA #%11010101,#%10101010,#%11010101,#%10101010	
+				.DA #%11100110,#%11001100,#%10011001,#%10110011	
+				.DA #%11110111,#%11101110,#%11011101,#%10111011	
+				.DA #%10001000,#%10010001,#%10100010,#%11000100	
+				.DA #%10011001,#%10110011,#%11100110,#%11001100	
+				.DA #%10101010,#%11010101,#%10101010,#%11010101	
+				.DA #%10111011,#%11110111,#%11101111,#%11011101	
+				.DA #%11001100,#%10011001,#%10110011,#%11100110	
+				.DA #%11011101,#%10111011,#%11110111,#%11101110	
+				.DA #%11101110,#%11011101,#%10111011,#%11110111	
+				.DA #%01111111,#%01111111,#%01111111,#%01111111	(color bit disable)
 				
 *Black          00    00    00    00    0000
 *Magenta        08    11    22    44    0001
@@ -465,15 +524,12 @@ Color.Pixels	.DA %00000000.00000000.00000000.00000000	0000,Black (color bit disa
 *Light Blue     3B    77    6E    5D    1101
 *Aqua           77    6E    5D    3B    1110
 *White          7F    7F    7F    7F    1111
-				
-
 *--------------------------------------
-CS.END
 DEVNAME			>PSTRING "GFX"
 *--------------------------------------
 DS.START
-*--------------------------------------
 DEVINFO			.DA #S.DEV.F.GFX		type of DEVINFO STRUCT
+DEVINFO.MODES	.DA #%10000011			XOR,16 & B/W
 DEVINFO.W		.DA 560					X.SIZE
 DEVINFO.H		.DA 192					Y.SIZE
 DS.END
diff --git a/DRV/MOUSE.DRV.S.txt b/DRV/MOUSE.DRV.S.txt
index 9d83bbf8..11c1b508 100644
--- a/DRV/MOUSE.DRV.S.txt
+++ b/DRV/MOUSE.DRV.S.txt
@@ -9,11 +9,19 @@ AUTO 6
 				.TF DRV/MOUSE.DRV
 *--------------------------------------
 				.INB INC/MACROS.I
+				.INB INC/IO.I
 				.INB INC/A2OSX.I
 *--------------------------------------
 ZPGoMouse		.EQ ZPDRV
 ZPTmpPtr1		.EQ ZPDRV+2
 *--------------------------------------
+EVENT.MOUSEUP	.EQ %00000001
+EVENT.MOUSEDOWN	.EQ %00000010
+EVENT.MOUSEMOVE	.EQ %00000100
+EVENT.MOUSEDRAG	.EQ %00001000
+EVENT.MOUSECLK	.EQ %00010000
+EVENT.MOUSEDCLK	.EQ %00100000
+*--------------------------------------
 SETMOUSE		.EQ $12  				Sets mouse mode 
 SERVEMOUSE		.EQ $13					Services mouse interrupt 
 READMOUSE		.EQ $14  				Reads mouse position 
@@ -22,10 +30,18 @@ POSMOUSE		.EQ $16					Sets mouse position to a user-defined pos
 CLAMPMOUSE		.EQ $17					Sets mouse bounds in a window 
 HOMEMOUSE 		.EQ $18					Sets mouse to upper-left corner of clamp win 
 INITMOUSE 		.EQ $19					Resets mouse clamps to default values,sets mouse position to 0,0
-XCLAMPLO		.EQ $0478 				low byte of low clamp. 
-XCLAMPHI		.EQ $04F8 				low byte of high clamp. 
-YCLAMPLO		.EQ $0578 				high byte of low clamp. 
-YCLAMPHI		.EQ $05F8				high byte of high clamp.
+LOCLAMPLO		.EQ $0478 				low byte of low clamp. 
+HICLAMPLO		.EQ $04F8 				low byte of high clamp. 
+LOCLAMPHI		.EQ $0578 				high byte of low clamp. 
+HICLAMPHI		.EQ $05F8				high byte of high clamp.
+MOUSEXLOx		.EQ $0478
+MOUSEYLOx		.EQ $04F8
+MOUSEXHIx		.EQ $0578
+MOUSEYHIx		.EQ $05F8
+MOUSESTSx		.EQ $0778
+MOUSESTSx.DOWN	.EQ %10000000
+MOUSESTSx.LDOWN	.EQ %01000000
+MOUSESTSx.MOVED	.EQ %00100000
 *--------------------------------------
 * Main DRV entry point
 * input :
@@ -58,19 +74,23 @@ OPEN			stz ZPTmpPtr1
 .2				ldy DEVSIG.Offset,x
 				lda (ZPTmpPtr1),y
 				cmp DEVSIG.Value,x
-				beq .3
+				bne .3
+				dex
+				bpl .2
+				bra .10
 				
-				inc ZPTmpPtr1+1			no match, try next slot....
+.3				inc ZPTmpPtr1+1			no match, try next slot....
 				lda ZPTmpPtr1+1
 				cmp #$C8
 				bne .1	
-				beq .99					Not Found in any slot, exiting
 				
-.3				dex
-				bpl .2
-
-				lda ZPTmpPtr1+1
+				lda #DEVMGR.ERRNOHW		Not Found in any slot, exiting
+				sec
+				rts	
+				
+.10				lda ZPTmpPtr1+1
 				and #$0F
+				sta DEVSLOT0n
 				pha
 				ora #$30
 				sta DEVNAME+4
@@ -86,13 +106,22 @@ OPEN			stz ZPTmpPtr1
 				ldx #0
 				ldy #S.DEV.NAME
 				
-.7				lda DEVNAME,x
+.4				lda DEVNAME,x
 				sta (pDevContext),y
 				cpx DEVNAME
-				beq .8
+				beq .5
 				inx
 				iny
-				bne .7
+				bne .4
+				
+.5				bit RROMBNK2			Renable ROM to allow MOUSE II firmware
+						
+				php						to read  IIe ROM ID bytes
+				sei
+				
+				lda RD80STORE
+				pha
+				sta CLR80STORE
 				
 				lda #1					Enable, Polling mode
 				ldy #SETMOUSE
@@ -100,41 +129,131 @@ OPEN			stz ZPTmpPtr1
 				
 				ldy #INITMOUSE			Reset
 				jsr GOMOUSE
-				
-*				lda #0					set X
-*				ldy #CLAMPMOUSE 
-*				jsr GOMOUSE
 
-*				lda #1					set Y
-*				ldy #CLAMPMOUSE 
-*				jsr GOMOUSE
+				stz LOCLAMPLO
+				stz LOCLAMPHI
+				lda #559
+				sta HICLAMPLO
+				lda /559
+				sta HICLAMPHI
 				
-.8				lda #S.DEV.F.MOUSE+S.DEV.F.EVENT
+				lda #0					set X
+				ldy #CLAMPMOUSE 
+				jsr GOMOUSE
+
+				stz LOCLAMPLO
+				stz LOCLAMPHI
+				lda #191
+				sta HICLAMPLO
+				lda /191
+				sta HICLAMPHI
+				
+				lda #1					set Y
+				ldy #CLAMPMOUSE 
+				jsr GOMOUSE
+				
+				ldy #HOMEMOUSE				
+				jsr GOMOUSE
+
+				pla
+				bpl .6
+				sta SET80STORE
+
+.6				plp
+				
+				lda #S.DEV.F.MOUSE+S.DEV.F.EVENT
 				sta (pDevContext)
 				clc
 				rts
-				
-.99				lda #DEVMGR.ERRNOHW
-				sec
-				rts	
 *--------------------------------------
 GETEVENT		>PULLW pEvent
-				lda #0
-				sec
+
+				php
+				sei
+
+				lda RD80STORE
+				pha
+				sta CLR80STORE
+				
+				ldy #READMOUSE
+				jsr GOMOUSE
+				
+				ldx DEVSLOT0n
+				ldy #S.EVT.DATALO
+				
+				lda MOUSESTSx,x
+				and #MOUSESTSx.DOWN+MOUSESTSx.LDOWN
+				beq .3					no button state change:up & previously up
+				cmp #MOUSESTSx.DOWN+MOUSESTSx.LDOWN
+				beq .3					no button state change:down & previously down
+				
+				asl						if CS, down & previoulsy up
+				bcc .1
+				
+				lda #EVENT.MOUSEUP
+				bra .2
+				
+.1				lda #EVENT.MOUSEDOWN
+
+.2				sta (pEvent),y
+				
+.3				lda MOUSESTSx,x
+				and #MOUSESTSx.MOVED
+				beq .4
+				
+				lda (pEvent),y
+				ora #EVENT.MOUSEMOVE
+				sta (pEvent),y
+				
+				ldy #S.EVT.DATAW1
+				lda MOUSEXLOx,x
+				sta (pEvent),y
+				iny
+				lda MOUSEXHIx,x
+				sta (pEvent),y
+				iny
+				lda MOUSEYLOx,x
+				sta (pEvent),y
+				iny
+				lda MOUSEYHIx,x
+				sta (pEvent),y
+			
+.4				pla
+				bpl .5
+				sta SET80STORE
+				
+.5				plp
+				ldy #S.EVT.DATALO
+				lda (pEvent),y
+				beq .9
+				
+				lda #S.EVT.F.MOUSE
+				sta (pEvent)
+				clc
+				rts
+
+.9				sec						A=0 : no event
 				rts
 *--------------------------------------
 OUT				clc
 				rts
 *--------------------------------------
-CLOSE			clc
+CLOSE			php
+				sei
+				lda #0					Disable
+				ldy #SETMOUSE
+				jsr GOMOUSE
+				plp
+				clc
 				rts
 *--------------------------------------
 GOMOUSE			pha
 				stz ZPGoMouse
-				lda DEVSLOTCn
-				sta ZPGoMouse+1
+				ldx DEVSLOTCn
+				stx ZPGoMouse+1
 				lda (ZPGoMouse),y
 				sta ZPGoMouse
+				ldy DEVSLOTn0
 				pla
 				jmp (ZPGoMouse)
 *--------------------------------------
@@ -143,6 +262,7 @@ DEVSIG.Offset	.HS 05070B0CFB
 DEVSIG.Value	.HS 38180120D6
 DEVSIG.Length	.EQ DEVSIG.Value-DEVSIG.Offset
 DEVNAME			>PSTRING "MOU0"
+DEVSLOT0n		.BS 1
 DEVSLOTCn		.BS 1
 DEVSLOTn0		.BS 1
 *--------------------------------------
diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt
index e8e2cbfa..f68eae16 100644
--- a/INC/A2osX.I.txt
+++ b/INC/A2osX.I.txt
@@ -83,6 +83,7 @@ SYS.GetDevTable		.EQ $74
 SYS.GetDevInfoA		.EQ $76
 
 SYS.DevOutA			.EQ $78
+SYS.GetDevByNameYA	.EQ $7A
 *--------------------------------------
 SYS.GetEvent		.EQ $80
 SYS.DestroyEvent	.EQ $82
@@ -105,6 +106,8 @@ SYS.SetNetCfg		.EQ $B2
 SYS.GetNetCfgA		.EQ $B4
 SYS.ClrNetCfgA		.EQ $B6
 *--------------------------------------
+SYS.ScreenSelectA	.EQ $C0
+*--------------------------------------
 A2osX.SaveSM	.EQ $100				Main
 A2osX.SaveSX	.EQ $101				Aux
 *--------------------------------------
@@ -178,8 +181,6 @@ S.MEM.F.NOMOV	.EQ %00100000
 S.MEM.F.ALIGN	.EQ %00010000
 S.MEM.F.SPARE	.EQ %00001000
 S.MEM.F.AUX		.EQ %00000100
-S.MEM.F.LC1		.EQ %00000010
-S.MEM.F.LC2		.EQ %00000001
 S.MEM.REFCNT	.EQ 1
 S.MEM.PTR		.EQ 2
 S.MEM.LEN		.EQ 4
@@ -212,7 +213,7 @@ S.DEV.hOWNERPS	.EQ 11
 *
 S.DEV.SIZE		.EQ 12
 *--------------------------------------
-* Driver Function Indexes
+* Generic Driver Functions
 *--------------------------------------
 DEVMGR.OPEN		.EQ 0
 DEVMGR.GETEVENT	.EQ 2
@@ -220,6 +221,11 @@ DEVMGR.OUT		.EQ 4
 DEVMGR.CLOSE	.EQ 6
 DEVMGR.GETINFO	.EQ 8
 *--------------------------------------
+* 'GFX' Class Driver Functions
+*--------------------------------------
+DEVMGR.GFX.SETPIXEL	.EQ 10
+DEVMGR.GFX.GETPIXEL	.EQ 12
+*--------------------------------------
 DEVMGR.ERRNICL	.EQ $EB					Invalid Command Line
 DEVMGR.ERRNOHW	.EQ $EC					No Hardware
 DEVMGR.ERRDNF	.EQ $ED					Device Not Found Error
diff --git a/INC/LIBCRYPT.I.txt b/INC/LIBCRYPT.I.txt
new file mode 100644
index 00000000..425e1c93
--- /dev/null
+++ b/INC/LIBCRYPT.I.txt
@@ -0,0 +1,29 @@
+PR#3
+PREFIX /A2OSX.BUILD
+NEW
+INC 1
+AUTO 6
+				.LIST OFF	
+				.OP	65C02
+*--------------------------------------
+LIBCRYPT.MD5PStrA		.EQ 4
+LIBCRYPT.MD5Init		.EQ 6
+LIBCRYPT.MD5Update		.EQ 8
+LIBCRYPT.MD5FinalizeA	.EQ 10
+*--------------------------------------
+* S.MD5 STRUCT
+*--------------------------------------
+S.MD5.ABCD0		.EQ 0
+S.MD5.A0		.EQ 0
+S.MD5.B0		.EQ 4
+S.MD5.C0		.EQ 8
+S.MD5.D0		.EQ 12
+S.MD5.BITCOUNT	.EQ 16
+S.MD5.EXTRABIT	.EQ 24
+S.MD5.FINALIZED	.EQ 25
+*
+S.MD5.SIZE		.EQ 26
+*--------------------------------------
+MAN
+SAVE INC/LIBCRYPT.I
+
diff --git a/INC/LIBGFX.I.txt b/INC/LIBGFX.I.txt
new file mode 100644
index 00000000..266dca32
--- /dev/null
+++ b/INC/LIBGFX.I.txt
@@ -0,0 +1,13 @@
+PR#3
+PREFIX /A2OSX.BUILD
+NEW
+INC 1
+AUTO 6
+				.LIST OFF	
+				.OP	65C02
+*--------------------------------------
+LIBGFX.test		.EQ 4
+*--------------------------------------
+MAN
+SAVE INC/LIBGFX.I
+
diff --git a/LIB/LIBGFX.S.txt b/LIB/LIBGFX.S.txt
new file mode 100644
index 00000000..67eee76c
--- /dev/null
+++ b/LIB/LIBGFX.S.txt
@@ -0,0 +1,41 @@
+PR#3
+PREFIX /A2OSX.BUILD
+NEW
+INC 1
+AUTO 6
+				.LIST OFF	
+				.OP	65C02
+				.OR	$2000
+				.TF LIB/LIBGFX.O
+*--------------------------------------
+				.INB INC/MACROS.I
+				.INB INC/A2OSX.I
+				.INB INC/LIBGFX.I
+*--------------------------------------
+* Main entry point
+* input :
+* X = Function
+*--------------------------------------
+* Code signature and relocation table
+*--------------------------------------
+* CLD 			$D8
+* JMP (*,x)		$7C
+* 				#JMPTABLE
+*				/JMPTABLE
+*--------------------------------------
+CS.START		cld
+				jmp (.1,x)
+.1				.DA LIB.LOAD
+				.DA LIB.UNLOAD
+
+*--------------------------------------
+				.DA 0
+				.DA CS.END-CS.START
+				.DA 0
+*--------------------------------------
+LIB.LOAD
+LIB.UNLOAD		clc
+				rts
+MAN
+SAVE LIB/LIBGFX.S
+ASM
diff --git a/SBIN/GUI.S.txt b/SBIN/GUI.S.txt
new file mode 100644
index 00000000..eccb925e
--- /dev/null
+++ b/SBIN/GUI.S.txt
@@ -0,0 +1,114 @@
+PR#3
+PREFIX /A2OSX.BUILD
+NEW
+INC 1
+AUTO 6
+				.LIST OFF
+				.OP	65C02
+				.OR	$2000
+				.TF SBIN/GUI
+*--------------------------------------
+				.INB INC/MACROS.I
+				.INB INC/A2OSX.I
+*--------------------------------------
+* Main entry point
+*--------------------------------------
+* Code signature and INIT table
+*--------------------------------------
+* CLD 			$D8
+* JMP (*,x)		$7C
+* 				#JMPTABLE
+*				/JMPTABLE
+*--------------------------------------
+CS.START		cld
+				jmp (.1,x)
+.1				.DA CS.INIT
+				.DA CS.RUN
+				.DA CS.DOEVENT
+				.DA	CS.QUIT
+L.DEVNAME.GFX	.DA DEVNAME.GFX
+				.DA 0
+				.DA CS.END-CS.START		Code Length To Relocate
+				.DA DS.END-DS.START		Data Segment to Allocate
+*--------------------------------------
+CS.INIT			>LDYA L.DEVNAME.GFX
+				>SYSCALL SYS.GetDevByNameYA
+				bcc .10
+				rts
+				
+.10				sta hDevGFX
+				>SYSCALL SYS.GetDevByIDA
+				>STYA ZPQuickPtr1
+				
+				ldy #S.DEV.hCS
+				lda (ZPQuickPtr1),y
+				>SYSCALL SYS.GetMemPtrA
+				
+				>STYA DevJMP
+
+				stz C
+				stz X
+				stz X+1
+				
+.1				stz Y		
+				>DEBUG
+.2				
+				>PUSHBI C				Color
+				>PUSHBI 2				Mode:1=B/W,2=16 colors,...,128=XOR
+				>PUSHB Y
+				>PUSHW X
+				jsr SetPixel
+				
+				inc Y
+				lda Y
+				cmp #192
+				bne .2
+				
+				inc C
+				lda C
+				cmp #16
+				bne .3
+				stz C		
+				
+.3				lda X
+				clc
+				adc #4
+				sta X
+				bcc .4
+				inc X+1
+				
+.4				lda X
+				sec
+				sbc #560
+				lda X+1
+				sbc /560
+				bcc .1
+				
+				clc	
+.9				rts
+*--------------------------------------
+CS.RUN			clc
+				rts
+*--------------------------------------
+CS.DOEVENT		clc
+				rts
+*--------------------------------------
+CS.QUIT			clc
+				rts
+*--------------------------------------
+SetPixel		ldx #DEVMGR.GFX.SETPIXEL
+				jmp (DevJMP)
+*--------------------------------------
+CS.END
+DEVNAME.GFX		>PSTRING "GFX"
+DEVNAME.MOU0	>PSTRING "MOU0"
+DS.START
+hDevGFX			.BS 1
+DevJMP			.BS 2
+X				.BS 2
+Y				.BS 1
+C				.BS 1
+DS.END
+MAN
+SAVE SBIN/GUI.S
+ASM
diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt
index 154e0d55..3df7e7c7 100644
--- a/SYS/KERNEL.S.DEV.txt
+++ b/SYS/KERNEL.S.DEV.txt
@@ -49,7 +49,7 @@ S.GetDevByIDA	sta ZPQuickPtr1
 				>STYA ZPQuickPtr2
 				
 .1				lda (ZPQuickPtr2)		get S.DEV.F
-				bpl .3					In use ?
+				bpl .2					In use ?
 				ldy #S.DEV.ID 	
 				lda (ZPQuickPtr2),y
 				cmp ZPQuickPtr1
@@ -80,6 +80,7 @@ S.GetDevByIDA	sta ZPQuickPtr1
 *  set DEVMGR.DEVPTR to devslot
 *--------------------------------------
 S.GetDevByNameA	jsr S.GetMemPtrA
+S.GetDevByNameYA
 				>STYA ZPQuickPtr1
 				>LDYAI DEVMGR.TABLE
 				>STYA DEVMGR.DEVPTR
@@ -126,7 +127,6 @@ S.GetDevByNameA	jsr S.GetMemPtrA
 *   X = LASTID
 *--------------------------------------
 S.GetDevTable	>LDYAI DEVMGR.TABLE
-				
 				ldx DEVMGR.LASTID
 				rts
 *--------------------------------------
@@ -142,28 +142,7 @@ S.DevOutA		ldx #DEVMGR.OUT
 S.GetDevInfoA	ldx #DEVMGR.GETINFO
 				jmp S.DevCallFunc
 *--------------------------------------
-* PRIVATE
-*--------------------------------------
-* S.DevOpenA
-* IN : 
-*  A = hDev
-* 	OUT CC = OK, CS = ERROR
-*--------------------------------------
-S.DevOpenA		ldx #DEVMGR.OPEN
-				bra S.DevCallFunc
-*--------------------------------------
-* S.DevGetEventA
-* IN : 
-*  A = hDev
-* 	OUT CC = OK, CS = ERROR
-*--------------------------------------
-S.DevGetEventA	ldx #DEVMGR.GETEVENT
-				bra S.DevCallFunc
-*--------------------------------------
-* S.DevCloseA
-*--------------------------------------
-S.DevCloseA		ldx #DEVMGR.CLOSE
-				bra S.DevCallFunc
+* 				PRIVATE
 *--------------------------------------
 S.DevCallFunc	jsr S.GetDevByIDA
 				bcs .9
@@ -180,7 +159,6 @@ S.DevCallFunc	jsr S.GetDevByIDA
 *  IN : none
 *  OUT : A = DevID 
 *    set DEVMGR.DEVPTR to freeslot
-*    init (DEVMGR.DEVPTR),S.DEV.ID with Dev.ID
 *--------------------------------------
 S.CreateDevice	>LDYAI DEVMGR.TABLE
 				>STYA DEVMGR.DEVPTR
diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt
index 919c2a65..69df3806 100644
--- a/SYS/KERNEL.S.ENV.txt
+++ b/SYS/KERNEL.S.ENV.txt
@@ -315,6 +315,28 @@ S.SetEnvVar		plp
 *--------------------------------------
 *               PRIVATE
 *--------------------------------------
+S.SetSysEnvA	>PUSHA					Push Cmd Line
+				>PUSHBI $3D				Push SEP='='
+				>PUSHBI 0				Push Token IDX
+				jsr S.PStrGetTkn
+				bcs *
+				phx						save X,A for discard
+				pha
+				pha
+				txa
+				>PUSHA
+				pla
+				>PUSHA
+				ldy #S.PS.hENV
+				lda TSKMGR.TABLE,y
+				>PUSHA
+				jsr S.SetEnvVarH
+
+				pla						disard NAME
+				jsr S.FreeMemA
+				pla						discard VALUE
+				jmp S.FreeMemA
+*--------------------------------------
 * S.SelectEnvH
 *  In:
 *   PULLB = hENV
diff --git a/SYS/KERNEL.S.SCR.txt b/SYS/KERNEL.S.SCR.txt
index 62f8023a..19593730 100644
--- a/SYS/KERNEL.S.SCR.txt
+++ b/SYS/KERNEL.S.SCR.txt
@@ -47,6 +47,54 @@ S.SysScrInit	stz SYSSCR.CPULOADI
 				clc
 				rts
 *--------------------------------------
+* S.ScreenSelectA
+*  IN :
+*   A = Screen to display
+*--------------------------------------
+S.ScreenSelectA	and A2osX.SCREENS		Screen is available ?
+				beq .9					...not setup up
+				
+				cmp #A2osX.SCREENS.S
+				bne .1
+				sta SETTEXT
+				sta SET80DISP
+				sta CLR80STORE
+				sta SETPAGE2
+				sta SETALTCHAR
+				lda #A2osX.SCREENS.S
+				bra .8
+
+.1				cmp #A2osX.SCREENS.C
+				bne .2
+				sta SETTEXT
+				sta SET80DISP
+				sta CLRPAGE2
+				sta SET80STORE
+				sta SETALTCHAR
+				lda #A2osX.SCREENS.C
+				bra .8
+				
+.2				cmp #A2osX.SCREENS.G
+				bne .9
+
+				sta CLRTEXT
+				sta CLRMIXED
+				sta SETHIRES
+				sta CLRPAGE2
+				
+				sta SET80DISP
+				sta SETIOUDIS
+				sta SETDHIRES
+				sta CLRDHIRES
+				sta SETDHIRES
+				sta CLRDHIRES
+				sta SETDHIRES
+
+				lda #A2osX.SCREENS.G
+				
+.8				sta A2osX.ACTIVESCRN
+.9				rts
+*--------------------------------------
 S.SysScrCPULoad ldx SYSSCR.CPULOADI
 				lda SYSSCR.CPULOADC,x
 				sta SYSSCR.BASL0+38
@@ -268,58 +316,6 @@ S.SysScrSetCharAtYX
 				ply
 				rts
 *--------------------------------------
-* S.ScreenSelectA
-*  IN :
-*   A = Screen to display
-*--------------------------------------
-S.ScreenSelectA	and A2osX.SCREENS		Screen is available ?
-				beq .9					...not setup up
-				
-				cmp #A2osX.SCREENS.S
-				bne .1
-				sta SETTEXT
-				sta SET80DISP
-				sta CLR80STORE
-				sta SETPAGE2
-				sta SETALTCHAR
-				lda #A2osX.SCREENS.S
-				bra .8
-
-.1				cmp #A2osX.SCREENS.C
-				bne .2
-				sta SETTEXT
-				sta SET80DISP
-				sta SET80STORE
-				sta CLRPAGE2
-				sta SETALTCHAR
-				lda #A2osX.SCREENS.C
-				bra .8
-				
-.2				cmp #A2osX.SCREENS.G
-				bne .9
-				sta CLRTEXT
-				sta CLRMIXED
-				sta SETHIRES
-				sta CLRPAGE2
-				
-				sta SETIOUDIS
-
-				sta CLR80DISP
-				sta SETDHIRES
-				sta CLRDHIRES
-				sta SETDHIRES
-				sta CLRDHIRES
-
-				sta SET80DISP
-				sta SETDHIRES
-				sta CLRDHIRES
-				sta SETDHIRES
-
-				lda #A2osX.SCREENS.G
-				
-.8				sta A2osX.ACTIVESCRN
-.9				rts
-*--------------------------------------
 SYSSCR.CH		.BS 1
 SYSSCR.CV		.BS 1
 SYSSCR.CPULOADI .BS 1
diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt
index 4c5d8801..0827f794 100644
--- a/SYS/KERNEL.S.txt
+++ b/SYS/KERNEL.S.txt
@@ -94,7 +94,7 @@ KERNEL.SYSCALL	jmp (.1,x)
 				.DA S.GetDevInfoA
 
 				.DA S.DevOutA
-				.DA 0
+				.DA S.GetDevByNameYA
 				.DA 0
 				.DA 0
 *--------------------------------------
@@ -137,6 +137,8 @@ KERNEL.SYSCALL	jmp (.1,x)
 				.DA 0
 				.DA 0
 				.DA 0
+*--------------------------------------
+				.DA S.ScreenSelectA		$C0
 *--------------------------------------
 S.Kernel		jsr S.KernelInit
 				jsr S.KernelRun
@@ -411,28 +413,6 @@ S.ExecCmdLine	jmp (.1,x)
 				.DA S.LoadDrvA			VCPU!!!!
 				.DA S.CreateProcessA	VCPU!!!!
 *--------------------------------------
-S.SetSysEnvA	>PUSHA					Push Cmd Line
-				>PUSHBI $3D				Push SEP='='
-				>PUSHBI 0				Push Token IDX
-				jsr S.PStrGetTkn
-				bcs *
-				phx						save X,A for discard
-				pha
-				pha
-				txa
-				>PUSHA
-				pla
-				>PUSHA
-				ldy #S.PS.hENV
-				lda TSKMGR.TABLE,y
-				>PUSHA
-				jsr S.SetEnvVarH
-
-				pla						disard NAME
-				jsr S.FreeMemA
-				pla						discard VALUE
-				jmp S.FreeMemA
-*--------------------------------------
 S.PrintSysEnv	ldy #S.PS.hENV
 				lda TSKMGR.TABLE,y		Get PS #0 ENV
 				jsr S.GetMemPtrA
