diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c
index 742cf766caeb00dfde6ea8ac36c8b838915bd949..b1355b1d1cb2a41f75dfe0bddb75865230c18f63 100644
--- a/src/conio/ciolib.c
+++ b/src/conio/ciolib.c
@@ -161,19 +161,19 @@ int try_conio_init(int mode)
 	if(win32_initciolib(mode)) {
 		cio_api.mode=CIOLIB_MODE_CONIO;
 		cio_api.mouse=1;
-		cio_api.puttext=puttext;
-		cio_api.gettext=gettext;
-		cio_api.textattr=textattr;
+		cio_api.puttext=win32_puttext;
+		cio_api.gettext=win32_gettext;
+		cio_api.textattr=win32_textattr;
 		cio_api.kbhit=win32_kbhit;
-		cio_api.wherey=wherey;
-		cio_api.wherex=wherex;
-		cio_api.putch=putch;
-		cio_api.gotoxy=gotoxy;
-		cio_api.gettextinfo=gettextinfo;
-		cio_api.setcursortype=_setcursortype;
+		cio_api.wherey=win32_wherey;
+		cio_api.wherex=win32_wherex;
+		cio_api.putch=win32_putch;
+		cio_api.gotoxy=win32_gotoxy;
+		cio_api.gettextinfo=win32_gettextinfo;
+		cio_api.setcursortype=win32_setcursortype;
 		cio_api.getch=win32_getch;
 		cio_api.getche=win32_getche;
-		cio_api.textmode=textmode;
+		cio_api.textmode=win32_textmode;
 		cio_api.getmouse=win32_getmouse;
 		cio_api.showmouse=win32_showmouse;
 		cio_api.hidemouse=win32_hidemouse;
@@ -729,7 +729,7 @@ void ciolib_delay(long a)
 int ciolib_putch(unsigned char a)
 {
 	CIOLIB_INIT();
-	
+
 	return(cio_api.putch(a));
 }
 
diff --git a/src/conio/win32cio.c b/src/conio/win32cio.c
index fac67c83c5e7de65bde31e8768a5f9f6469f9702..cb041b484fd5f0ea56f8c81783b3c1a65afd47f3 100644
--- a/src/conio/win32cio.c
+++ b/src/conio/win32cio.c
@@ -1,9 +1,10 @@
 #include <windows.h>	/* INPUT_RECORD, etc. */
 #include <stdio.h>		/* stdin */
-#include "conio.h"
-#define CIOLIB_NO_MACROS
 #include "ciolib.h"
 #include "keys.h"
+#include "win32cio.h"
+
+const int 	cio_tabs[10]={9,17,25,33,41,49,57,65,73,80};
 
 static struct cio_mouse_event	cio_last_button_press;
 static struct cio_mouse_event	last_mouse_click;
@@ -11,6 +12,54 @@ static struct cio_mouse_event	last_mouse_click;
 static int lastch=0;
 static int domouse=0;
 
+static int currattr=7;
+
+WORD DOStoWinAttr(int newattr)
+{
+	WORD ret=0;
+
+	if(newattr&0x01)
+		ret|=FOREGROUND_BLUE;
+	if(newattr&0x02)
+		ret|=FOREGROUND_GREEN;
+	if(newattr&0x04)
+		ret|=FOREGROUND_RED;
+	if(newattr&0x08)
+		ret|=FOREGROUND_INTENSITY;
+	if(newattr&0x10)
+		ret|=BACKGROUND_BLUE;
+	if(newattr&0x20)
+		ret|=BACKGROUND_GREEN;
+	if(newattr&0x40)
+		ret|=BACKGROUND_RED;
+	if(newattr&0x80)
+		ret|=BACKGROUND_INTENSITY;
+	return(ret);
+}
+
+unsigned char WintoDOSAttr(WORD newattr)
+{
+	unsigned char ret=0;
+
+	if(newattr&FOREGROUND_BLUE)
+		ret|=0x01;
+	if(newattr&FOREGROUND_GREEN)
+		ret|=0x02;
+	if(newattr&FOREGROUND_RED)
+		ret|=0x04;
+	if(newattr&FOREGROUND_INTENSITY)
+		ret|=0x08;
+	if(newattr&BACKGROUND_BLUE)
+		ret|=0x10;
+	if(newattr&BACKGROUND_GREEN)
+		ret|=0x20;
+	if(newattr&BACKGROUND_RED)
+		ret|=0x40;
+	if(newattr&BACKGROUND_INTENSITY)
+		ret|=0x80;
+	return(ret);
+}
+
 int win32_kbhit(void)
 {
 	INPUT_RECORD input;
@@ -141,7 +190,7 @@ int win32_initciolib(long inmode)
 
 	if(!isatty(fileno(stdin)))
 		return(0);
-	textmode(inmode);
+	win32_textmode(inmode);
 	if(!GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &conmode))
 		return(0);
 	conmode&=~ENABLE_PROCESSED_INPUT;
@@ -172,102 +221,198 @@ int win32_showmouse(void)
 	return(0);
 }
 
-#if !defined(__BORLANDC__)
-
-void textmode(int mode)
-{
-}
-
-void clreol(void)
+void win32_textmode(int mode)
 {
 }
 
-void clrscr(void)
+int win32_gettext(int left, int top, int right, int bottom, void* buf)
 {
+	CHAR_INFO *ci;
+	int	x;
+	int	y;
+	COORD	bs;
+	COORD	bc;
+	SMALL_RECT	reg;
+	unsigned char	*bu;
+
+	bu=buf;
+	bs.X=right-left+1;
+	bs.Y=bottom-top+1;
+	bc.X=0;
+	bc.Y=0;
+	reg.Left=left-1;
+	reg.Right=right-1;
+	reg.Top=top-1;
+	reg.Bottom=bottom-1;
+	ci=(CHAR_INFO *)malloc(sizeof(CHAR_INFO)*(bs.X*bs.Y));
+	ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),ci,bs,bc,&reg);
+	for(y=0;y<=(bottom-top);y++) {
+		for(x=0;x<=(right-left);x++) {
+			bu[((y*bs.X)+x)*2]=ci[(y*bs.X)+x].Char.AsciiChar;
+			bu[(((y*bs.X)+x)*2)+1]=WintoDOSAttr(ci[(y*bs.X)+x].Attributes);
+		}
+	}
+	free(ci);
+	return 1;
 }
 
-void delline(void)
+void win32_gettextinfo(struct text_info* info)
 {
-}
+	CONSOLE_SCREEN_BUFFER_INFO bi;
 
+	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&bi);
 
-int gettext(int left, int top, int right, int bottom, void* buf)
-{
-	return 1;
+	/* ToDo Fix this! */
+	info->currmode=C80;
+	info->curx=bi.dwCursorPosition.X+1;
+	info->cury=bi.dwCursorPosition.Y+1;
+	info->attribute=currattr;
+	info->screenheight=bi.dwSize.Y;
+	info->screenwidth=bi.dwSize.X;
 }
 
-void gettextinfo(struct text_info* info)
+void win32_gotoxy(int x, int y)
 {
-}
-
+	COORD	cp;
 
-void gotoxy(int x, int y)
-{
+	cp.X=x-1;
+	cp.Y=y-1;
+	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cp);
 }
 
-
-void highvideo(void)
+void win32_highvideo(void)
 {
+	win32_textattr(currattr|0x08);
 }
 
 
-void insline(void)
+void win32_lowvideo(void)
 {
+	win32_textattr(currattr&0xf8);
 }
 
 
-void lowvideo(void)
+void win32_normvideo(void)
 {
+	win32_textattr(7);
 }
 
-
-int movetext(int left, int top, int right, int bottom, int destleft, int desttop)
+int win32_puttext(int left, int top, int right, int bottom, void* buf)
 {
+	CHAR_INFO *ci;
+	int	x;
+	int	y;
+	COORD	bs;
+	COORD	bc;
+	SMALL_RECT	reg;
+	unsigned char	*bu;
+
+	bu=buf;
+	bs.X=right-left+1;
+	bs.Y=bottom-top+1;
+	bc.X=0;
+	bc.Y=0;
+	reg.Left=left-1;
+	reg.Right=right-1;
+	reg.Top=top-1;
+	reg.Bottom=bottom-1;
+	ci=(CHAR_INFO *)malloc(sizeof(CHAR_INFO)*(bs.X*bs.Y));
+	for(y=0;y<bs.Y;y++) {
+		for(x=0;x<bs.X;x++) {
+			ci[(y*bs.X)+x].Char.AsciiChar=bu[((y*bs.X)+x)*2];
+			ci[(y*bs.X)+x].Attributes=DOStoWinAttr(bu[(((y*bs.X)+x)*2)+1]);
+		}
+	}
+	WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),ci,bs,bc,&reg);
+	free(ci);
 	return 1;
 }
 
-
-void normvideo(void)
+void win32_textattr(int newattr)
 {
+	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),DOStoWinAttr(newattr));
+	currattr=newattr;
 }
 
 
-int puttext(int left, int top, int right, int bottom, void* buf)
+void win32_textbackground(int newcolor)
 {
-	return 1;
+	win32_textattr((currattr&0x0f)|((newcolor&0xf0)<<4));
 }
 
 
-void textattr(int newattr)
+void win32_textcolor(int newcolor)
 {
+	win32_textattr((currattr&0xf0)|((newcolor&0x0f)<<4));
 }
 
-
-void textbackground(int newcolor)
+void win32_setcursortype(int type)
 {
-}
-
+	CONSOLE_CURSOR_INFO	ci;
 
-void textcolor(int newcolor)
-{
+	switch(type) {
+		case _NOCURSOR:
+			ci.bVisible=FALSE;
+			break;
+		
+		case _SOLIDCURSOR:
+			ci.bVisible=TRUE;
+			ci.dwSize=100;
+			break;
+		
+		default:	/* Normal cursor */
+			ci.bVisible=TRUE;
+			ci.dwSize=13;
+			break;
+	}
+	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&ci);
 }
 
-void window(int left, int top, int right, int bottom)
+int win32_wherex(void)
 {
-}
+	CONSOLE_SCREEN_BUFFER_INFO bi;
 
-void _setcursortype(int type)
-{
+	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&bi);
+	return bi.dwCursorPosition.X+1;
 }
 
-int wherex(void)
+int win32_wherey(void)
 {
-	return 0;
+	CONSOLE_SCREEN_BUFFER_INFO bi;
+
+	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&bi);
+	return bi.dwCursorPosition.Y+1;
 }
 
-int wherey(void)
+int win32_putch(int ch)
 {
-	return 0;
+	struct text_info ti;
+	WORD sch;
+	int i;
+	unsigned char buf[2];
+	DWORD wr;
+
+	buf[0]=ch;
+	buf[1]=currattr;
+
+	win32_gettextinfo(&ti);
+	switch(ch) {
+		case '\r':
+			gotoxy(1,ti.cury);
+			return('\r');
+		case '\n':
+			if(ti.cury==ti.screenheight) {
+				if(_wscroll)
+					wscroll();
+				gotoxy(ti.curx,ti.cury);
+				return('\n');
+			}
+			gotoxy(ti.curx,ti.cury+1);
+			return('\n');
+		default:
+			if(ti.curx==ti.screenwidth && ti.cury==ti.screenheight && !_wscroll)
+				return(0);
+			WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),buf,1,&wr,NULL);
+			return(ch);
+	}
 }
-
-#endif
diff --git a/src/conio/win32cio.h b/src/conio/win32cio.h
index 3cb3b33bbcb937cc3e4b2474629cbdf9d57a04cb..90f4ce938c07a11210574851d7058a98660549ec 100644
--- a/src/conio/win32cio.h
+++ b/src/conio/win32cio.h
@@ -11,40 +11,24 @@ int win32_getmouse(struct cio_mouse_event *mevent);
 int win32_hidemouse(void);
 int win32_showmouse(void);
 
-#if !defined(__BORLANDC__)
-void	clreol(void);
-void	clrscr(void);
-void	delline(void);
-int		gettext(int left, int top, int right, int bottom, void*);
-void	gettextinfo(struct text_info*);
-void	gotoxy(int x, int y);
-void	highvideo(void);
-void	insline(void);
-void	lowvideo(void);
-int		movetext(int left, int top, int right, int bottom, int destleft, int desttop);
-void	normvideo(void);
-int		puttext(int left, int top, int right, int bottom, void*);
-void	textattr(int newattr);
-void	textbackground(int newcolor);
-void	textcolor(int newcolor);
-void	textmode(int newmode);
-void	window(int left, int top, int right, int bottom);
-void	_setcursortype(int);
-char*	cgets(char*);
-int		cprintf(const char*, ...);
-int		cputs(const char*);
-int		cscanf(const char*, ... );
-int		getch(void);
-int		getche(void);
-char*	getpass(const char*);
-int		kbhit(void);
-int		putch(int);
-int		ungetch(int);
-int		wherex(void);
-int		wherey(void);
-
-#endif
-
+int	win32_gettext(int left, int top, int right, int bottom, void*);
+void	win32_gettextinfo(struct text_info*);
+void	win32_gotoxy(int x, int y);
+void	win32_highvideo(void);
+void	win32_lowvideo(void);
+void	win32_normvideo(void);
+int	win32_puttext(int left, int top, int right, int bottom, void*);
+void	win32_textattr(int newattr);
+void	win32_textbackground(int newcolor);
+void	win32_textcolor(int newcolor);
+void	win32_textmode(int newmode);
+void	win32_setcursortype(int);
+int	win32_getch(void);
+int	win32_getche(void);
+int	win32_kbhit(void);
+int	win32_putch(int);
+int	win32_wherex(void);
+int	win32_wherey(void);
 
 #ifdef __cplusplus
 }