diff --git a/console/interface.c b/console/interface.c
index 57db6e9..1cfb1a9 100644
--- a/console/interface.c
+++ b/console/interface.c
@@ -150,6 +150,14 @@
       driver.refresh();
 }
 
+int CONSOLE_AllocColor(int color)
+{
+   if (driver.allocColor)
+      return driver.allocColor(color);
+   else 
+      return 0;
+}
+
 /* This function is only at the CONSOLE level. */
 /* Admittably, calling the variable norefresh might be a bit dumb...*/
 void CONSOLE_SetRefresh(int setting)
@@ -201,6 +209,12 @@
       driver.notifyResizeScreen(x, y);
 }
 
+void CONSOLE_SetBackgroundColor(int fg, int bg)
+{
+   if (driver.setBackgroundColor)
+      driver.setBackgroundColor(fg, bg);
+}
+
 void CONSOLE_WriteRawString(char *str)
 {
    /* This is a special function that is only for internal use and 
diff --git a/console/ncurses.c b/console/ncurses.c
index 593361f..868127d 100644
--- a/console/ncurses.c
+++ b/console/ncurses.c
@@ -31,6 +31,8 @@
 
 SCREEN *ncurses_screen;
 
+static int get_color_pair(int fg_color, int bg_color);
+
 void NCURSES_Start()
 {
    /* This should be the root driver so we can ignore anything
@@ -45,6 +47,8 @@
    driver.getCursorPosition = NCURSES_GetCursorPosition;
    driver.getCharacterAtCursor = NCURSES_GetCharacterAtCursor;
    driver.clearScreen = NCURSES_ClearScreen;
+   driver.allocColor = NCURSES_AllocColor;
+   driver.setBackgroundColor = NCURSES_SetBackgroundColor;
 #ifdef HAVE_RESIZETERM
    driver.notifyResizeScreen = NCURSES_NotifyResizeScreen;
 #endif
@@ -60,10 +64,11 @@
    ncurses_screen = newterm("xterm", driver.console_out,
       driver.console_in);
    set_term(ncurses_screen);
-   cbreak();
+   start_color();
+   raw();
    noecho();
    nonl();
-   intrflush(stdscr, FALSE);
+/*   intrflush(stdscr, FALSE); */ 
    keypad(stdscr, TRUE);
    nodelay(stdscr, TRUE);
 }
@@ -71,9 +76,17 @@
 void NCURSES_Write(char output, int fg, int bg, int attribute)
 {
    char row, col;
+   int pair;
+   
+   if (!fg)
+      fg = COLOR_WHITE; /* Default */
 
-   /* We can discard all extended information. */
-   if (waddch(stdscr, output) == ERR)
+   if (!bg)
+      bg = COLOR_BLACK; /* Default */
+
+   pair = get_color_pair(fg, bg);
+
+   if (waddch(stdscr, output | COLOR_PAIR(pair)) == ERR)
    {
       NCURSES_GetCursorPosition(&row, &col);
       FIXME(console, "NCURSES: waddch() failed at %d, %d.\n", row, col);
@@ -150,6 +163,36 @@
    werase(stdscr);
 }
 
+int NCURSES_AllocColor(int color)
+{
+   /* Currently support only internal colors */
+   switch (color)
+   {
+      case WINE_BLACK:		return COLOR_BLACK;
+      case WINE_WHITE:		return COLOR_WHITE;
+      case WINE_RED:		return COLOR_RED;
+      case WINE_GREEN:		return COLOR_GREEN;
+      case WINE_YELLOW:		return COLOR_YELLOW;
+      case WINE_BLUE:     	return COLOR_BLUE;
+      case WINE_MAGENTA:	return COLOR_MAGENTA;
+      case WINE_CYAN:		return COLOR_CYAN;
+   }
+
+   FIXME(console, "Unable to allocate color %d\n", color);
+
+   /* Don't allocate a color... yet */
+   return 0;
+}
+
+void NCURSES_SetBackgroundColor(int fg, int bg)
+{
+   int pair;
+
+   pair = get_color_pair(fg, bg);
+
+   bkgdset(COLOR_PAIR(pair));
+}
+
 #ifdef HAVE_RESIZETERM
 
 void NCURSES_NotifyResizeScreen(int x, int y)
@@ -161,6 +204,37 @@
    resizeterm(y, x);
 }
 
-#endif
+#endif /* HAVE_RESIZETERM */
+
+static int get_color_pair(int fg_color, int bg_color)
+{
+   /* ncurses internally uses "color pairs" in addition to the "pallet" */
+   /* This isn't the best way to do this. Or even close */
+
+   static int current = 0;
+   static int fg[255];     /* 16 x 16 is enough */
+   static int bg[255];
+   int x;
+
+   /* The first pair is hardwired into ncurses */
+   fg[0] = COLOR_WHITE;
+   bg[0] = COLOR_BLACK;
+
+   for (x = 0; x <= current; x++)
+   {
+      if ((fg_color == fg[x]) && (bg_color == bg[x]))
+      {
+         TRACE(console, "Color pair: already allocated\n");
+         return x;  
+      }    
+   }
+
+   /* Need to allocate new color */
+   current++;
+   fg[current] = fg_color;
+   bg[current] = bg_color;
+   TRACE(console, "Color pair: allocated.\n");
+   return init_pair(current, fg_color, bg_color);
+}
 
 #endif /* WINE_NCURSES */
diff --git a/include/console.h b/include/console.h
index 949fe65..da96d6f 100644
--- a/include/console.h
+++ b/include/console.h
@@ -35,8 +35,12 @@
    void (*getCharacterAtCursor)(char *, int *, int *, int *);
    void (*clearScreen)();
 
+   /* Color-control functions */
+   int  (*allocColor)(int color);
+   void (*setBackgroundColor)(int fg, int bg);
+
    /* Keyboard Functions */
-   int (*checkForKeystroke)(char *, char *);
+   int  (*checkForKeystroke)(char *, char *);
    void (*getKeystroke)(char *, char *);
 
    /* Windowing Functions */
@@ -83,6 +87,8 @@
 void CONSOLE_ResizeScreen();
 void CONSOLE_NotifyResizeScreen(); 
 void CONSOLE_WriteRawString(char *);
+int  CONSOLE_AllocColor(int);
+void CONSOLE_SetBackgroundColor(int fg, int bg);
 
 /* Generic Defines */
 void GENERIC_Start();
@@ -111,6 +117,8 @@
 void NCURSES_Refresh();
 void NCURSES_ClearScreen();
 void NCURSES_NotifyResizeScreen(int x, int y);
+int  NCURSES_AllocColor(int);
+void NCURSES_SetBackgroundColor(int fg, int bg);
 
 #endif /* WINE_NCURSES */
 
@@ -120,4 +128,23 @@
 void XTERM_Init();
 void XTERM_ResizeScreen(int x, int y);
 
+/* Color defines */
+/* These will eventually be hex triples for dynamic allocation */
+#define WINE_BLACK		1
+#define WINE_BLUE		2
+#define WINE_GREEN		3
+#define WINE_CYAN		4
+#define WINE_MAGENTA		5
+#define WINE_BROWN		6
+#define WINE_RED		7
+#define WINE_LIGHT_GRAY		8
+#define WINE_DARK_GRAY		9
+#define WINE_LIGHT_BLUE		10
+#define WINE_LIGHT_GREEN	11
+#define WINE_LIGHT_RED		12
+#define WINE_LIGHT_MAGENTA	13
+#define WINE_LIGHT_CYAN		14
+#define WINE_YELLOW		15
+#define WINE_WHITE		16
+
 #endif /* CONSOLE_H */
diff --git a/msdos/int10.c b/msdos/int10.c
index 23d3763..d4464d3 100644
--- a/msdos/int10.c
+++ b/msdos/int10.c
@@ -9,14 +9,15 @@
 #include "debug.h"
 #include "console.h"
 
-static int conv_text_mode_attribute_attribute(char attribute);
-static int conv_text_mode_attribute_fg_color(char attribute);
-static int conv_text_mode_attribute_bg_color(char attribute);
+static void conv_text_mode_attributes(char attribute, int *fg, int *bg,
+       int *wattribute);
 static void write_char_attribute_at_cursor(char output, char page_num, 
        char attribute, short times);
 static void scroll_window(int direction, char lines, char row1, 
    char col1, char row2, char col2, char attribute);
 
+static int color_pallet[16];
+
 #define SCROLL_UP 1
 #define SCROLL_DOWN 2
 
@@ -48,23 +49,53 @@
 
 void WINAPI INT_Int10Handler( CONTEXT *context )
 {
+    static int registered_colors = FALSE;
+    static int video_mode = 7;
+    static int video_columns = 80;
+
+    if (!registered_colors)
+    {
+        /* Colors:
+             0000b   black          1000b   dark gray
+             0001b   blue           1001b   light blue
+             0010b   green          1010b   light green
+             0011b   cyan           1011b   light cyan
+             0100b   red            1100b   light red
+             0101b   magenta        1101b   light magenta
+             0110b   brown          1110b   yellow
+             0111b   light gray     1111b   white
+        */
+
+        color_pallet[0]  = CONSOLE_AllocColor(WINE_BLACK);
+        color_pallet[1]  = CONSOLE_AllocColor(WINE_BLUE);
+        color_pallet[2]  = CONSOLE_AllocColor(WINE_GREEN);
+        color_pallet[3]  = CONSOLE_AllocColor(WINE_CYAN);
+        color_pallet[4]  = CONSOLE_AllocColor(WINE_RED);
+        color_pallet[5]  = CONSOLE_AllocColor(WINE_MAGENTA);
+        color_pallet[6]  = CONSOLE_AllocColor(WINE_BROWN);
+        color_pallet[7]  = CONSOLE_AllocColor(WINE_LIGHT_GRAY);
+        color_pallet[8]  = CONSOLE_AllocColor(WINE_DARK_GRAY);
+        color_pallet[9]  = CONSOLE_AllocColor(WINE_LIGHT_BLUE);
+        color_pallet[10] = CONSOLE_AllocColor(WINE_LIGHT_GREEN);
+        color_pallet[11] = CONSOLE_AllocColor(WINE_LIGHT_CYAN);
+        color_pallet[12] = CONSOLE_AllocColor(WINE_LIGHT_RED);
+        color_pallet[13] = CONSOLE_AllocColor(WINE_LIGHT_MAGENTA);
+        color_pallet[14] = CONSOLE_AllocColor(WINE_YELLOW);
+        color_pallet[15] = CONSOLE_AllocColor(WINE_WHITE);
+    }
+
     switch(AH_reg(context)) {
 
     case 0x00: /* SET VIDEO MODE */
-        /* Text Modes: (can xterm or similar change text rows/cols?) */
-        /*    Answer: Yes. We can add that later. */
-        /*      Er, maybe. I thought resizeterm() did it, I was wrong. */
+        /* Text Modes: */
         /* (mode) (text rows/cols)
             0x00 - 40x25 
             0x01 - 40x25
             0x02 - 80x25
-            0x03 - 80x25 or 80x43 or 80x50 
+            0x03 - 80x25 or 80x43 or 80x50 (assume 80x25) 
             0x07 - 80x25
         */
 
-        /* We may or may not want to do a refresh between the resize and
-           the clear... */
-
         switch (AL_reg(context)) {
             case 0x00: /* 40x25 */
             case 0x01:
@@ -73,6 +104,8 @@
                    AL_reg(context));
                 CONSOLE_ResizeScreen(40, 25);
                 CONSOLE_ClearScreen();
+                video_mode = AL_reg(context);
+                video_columns = 40;
                 break;                
             case 0x02:
             case 0x03:
@@ -82,10 +115,13 @@
                    AL_reg(context));
                 CONSOLE_ResizeScreen(80, 25);
                 CONSOLE_ClearScreen();
+                video_mode = AL_reg(context);
+                video_columns = 80;
                 break;
             case 0x13:
                 TRACE(int10, "Setting VGA 320x200 256-color mode\n");
                 VGA_SetMode(320,200,8);
+                video_mode = AL_reg(context);
                 break;
             default:
                 FIXME(int10, "Set Video Mode (0x%x) - Not Supported\n", 
@@ -184,7 +220,8 @@
     case 0x0b: 
         switch BH_reg(context) {
         case 0x00: /* SET BACKGROUND/BORDER COLOR */
-            FIXME(int10, "Set Background/Border Color - Not Supported\n");
+            /* In text modes, this sets only the border */
+            TRACE(int10, "Set Background/Border Color - Ignored\n");
             break;
         case 0x01: /* SET PALETTE */
             FIXME(int10, "Set Palette - Not Supported\n");
@@ -214,8 +251,8 @@
     case 0x0f: /* GET CURRENT VIDEO MODE */
         TRACE(int10, "Get Current Video Mode\n");
         /* Note: This should not be a constant value. */
-        AL_reg(context) = 0x07; /* 80x25 text mode */
-        AH_reg(context) = 80; /* 80 columns */
+        AL_reg(context) = video_mode;
+        AH_reg(context) = video_columns;
         BH_reg(context) = 0; /* Display page 0 */
         break;
 
@@ -421,9 +458,10 @@
        return;
     }  
 
-    wattribute = conv_text_mode_attribute_attribute(attribute);
-    fg_color = conv_text_mode_attribute_fg_color(attribute);
-    bg_color = conv_text_mode_attribute_bg_color(attribute);
+    conv_text_mode_attributes(attribute, &fg_color, &bg_color,
+        &wattribute);
+
+    TRACE(int10, "Fore: %d Back: %d\n", fg_color, bg_color);
 
     CONSOLE_GetCursorPosition(&x, &y);
 
@@ -436,65 +474,29 @@
     CONSOLE_MoveCursor(x, y);
 }
 
-static int conv_text_mode_attribute_fg_color(char attribute)
+static void conv_text_mode_attributes(char attribute, int *fg, int *bg,
+   int *wattribute)
 {
-    /* This is a local function to convert the color values 
-       in text-mode attributes to Wine's scheme */
-    
+    /* This is a local function to convert the text-mode attributes
+       to Wine's color and attribute scheme */
+
     /* Foreground Color is stored in bits 3 through 0 */
-
-    /* Colors:
-          0000b   black          1000b   dark gray
-          0001b   blue           1001b   light blue
-          0010b   green          1010b   light green
-          0011b   cyan           1011b   light cyan
-          0100b   red            1100b   light red
-          0101b   magenta        1101b   light magenta
-          0110b   brown          1110b   yellow
-          0111b   light gray     1111b   white
-    */
-
-    /* FIXME - We need color values for those and some generic constants */
-
-    return 0; /* Bogus, temporary data. */
-}
-
-static int conv_text_mode_attribute_bg_color(char attribute)
-{
-    /* This is a local function to convert the color values 
-       in text-mode attributes to Wine's scheme */
-    
     /* Background Color is stored in bits 6 through 4 */
-    
-    /* Colors same as above, but only the left column */
-
-    /* FIXME - We need color values for those and some generic constants */
-
-    return 0; /* Bogus, temporary data. */
-}
-
-static int conv_text_mode_attribute_attribute(char attribute)
-{
-    /* This is a local function to convert the attribute values 
-       in text-mode attributes to Wine's scheme */
-    
     /* If this has bit 7 set, then we need to blink */
 
-    if (255 && attribute)
-    {
-        /* return TEXT_ATTRIBUTE_BLINK; */
-    }
-    
-    return 0; /* Bogus data */
+    *fg = color_pallet[attribute & 15];
+    *bg = color_pallet[(attribute & 112) / 16];
+    *wattribute = attribute & 128;
+
 }
 
 static void scroll_window(int direction, char lines, char row1, 
    char col1, char row2, char col2, char attribute)
 {
-   int wattribute, bg_color;
+   int wattribute, bg_color, fg_color;
 
-   wattribute = conv_text_mode_attribute_attribute(attribute);
-   bg_color = conv_text_mode_attribute_bg_color(attribute);
+   conv_text_mode_attributes(attribute, &fg_color, &bg_color,
+      &wattribute);
 
    if (!lines) /* Actually, clear the window */
    {
