diff --git a/exec/load/layout.js b/exec/load/layout.js
index 5fb99bfe17d20e7864dbbaaea8601985d5cd0a7f..15e962360fbf83b99b50d932cf3bb0b9c6064ac4 100644
--- a/exec/load/layout.js
+++ b/exec/load/layout.js
@@ -3,99 +3,134 @@
 /*
 	by Matt Johnson (MCMLXXIX) 2010
 	
-	the Layout() object is intended as an array of Window() objects.
-	the Window() object contains tabs, which contain whatever content 
-	they are supplied with. each tab object must have a draw() method
-	and a handle_command() method. 
-
+	the Layout() object is intended as an array of Layout_Window() objects.
+	the Layout_Window() object contains tabs, which contain whatever content 
+	they are supplied with. each tab object should have the following methods, 
+	though it may exist without them:
+	
+		handle_command()
+		cycle()
+		draw()
+		
 	this setup allows a modular tabbed window interface for things such as:
 	
 		IRC chat rooms
 		user lists
 		lightbar menus
-		ANSI graphics
+		ANSI graphics (static or animated)
 		etc...
 	
-	usage example:
-	
-		var x=1;
-		var y=1;
-		var width=79;
-		var height=24;
-		var use_scrollbar=true;
-		var use_theme=false;
-		
-		var layout=new Layout();
-		layout.add("chat");
-		layout.current_window.init(x,y,width,height,use_scrollbar,use_theme);
-		
-		var chat=new ChatEngine();
-		chat.init(x,y,width,height);
-		chat.joinChan("#synchronet");
-
-		layout.current_window.add("#synchronet");
-		layout.current_window.current_tab.init(chat.chatrooms["#synchronet"]);
-		
-		layout.current_window.current_tab.cycle();
-		layout.window("chat").tab("#synchronet").cycle();
-		
-		layout.window("chat").tab("#synchronet").draw(argument1,argument2,etc...);
-		layout.current_window.draw();
-		
-		layout.current_window.cycle();
-		layout.cycle();
 */
 
 load("funclib.js");
+load("sbbsdefs.js");
+
+var layout_settings;
 
-function Layout() 
+/* main layout object */
+function Layout(theme) 
 {
-	this.index=0;
-	this.windows=[];
-	this.windows_map=[];
+	/* private properties */
+	var windows=[];
+	var windows_map=[];
+	var index={ value:0 };
+	
+	/* public window index */
+	this.index getter=function() {
+		return index.value;
+	}
 	
-	/* add a new window to layout */
-	this.add=function(name) {
-		/* if window does not exist, create new window */
-		if(!this.windows_map[name.toUpperCase()] >= 0) {
-			var window=new Layout_Window(name);
-			this.index=this.windows.length;
-			this.windows_map[name.toUpperCase()]=this.windows.length;
-			this.windows.push(window);
-			log(LOG_DEBUG, "new window created: " + name);
-			return true;
+	this.index setter=function(value) {
+		if(isNaN(value) || !windows[value]) return false;
+		index.value=value;
+		return true;
+	}
+	
+	/* initialize layout */
+	this.init=function(theme) {
+		/* load theme, if specified */
+		if(theme) {
+			//ToDo: create layout_themes.ini
 		}
 		
-		/* otherwise fail */
+		/* otherwise, load default color scheme */
 		else {
+			layout_settings=new Layout_Settings(
+				LIGHTGRAY, /* window foreground */
+				BG_BLACK,	/* window background */
+				YELLOW,	/* window highlight foreground */
+				BG_BLUE,	/* window highlight background */
+				LIGHTGRAY,	/* border foreground color */
+				BG_BLACK,	/* border background color */
+				BLACK,		/* tab foreground (normal) */
+				BG_LIGHTGRAY, /* tab background */
+				LIGHTCYAN,	/* tab highlight foreground */	
+				BG_CYAN,		/* tab highlight background */
+				RED,		/* tab alert foregruond */
+				MAGENTA,	/* tab update foreground */
+				BLUE		/* tab user msg foreground */
+			);
+		}
+	}
+
+	/* add a new window to layout */
+	this.add_window=function(name,x,y,w,h) {
+		if(!name) {
+			log(LOG_WARNING, "ERROR: no window name specified");
+			return false;
+		}
+		if(windows_map[name.toUpperCase()] >= 0) {
 			log(LOG_WARNING, "ERROR: a window with this name already exists: " + name);
 			return false;
 		} 
+		
+		
+		/* if no parameters are supplied, initialize fullscreen defaults */
+		if(!x) x=1;
+		if(!y) y=1;
+		if(!w) w=console.screen_columns-1;
+		if(!h) h=console.screen_rows;
+		
+		/* verify window parameters */
+		if(x <= 0 || y <= 0 
+			|| isNaN(x) || isNaN(y) 
+			|| (x-1+w) > console.screen_columns
+			|| (y-1+h) > console.screen_rows) {
+			log(LOG_WARNING, "ERROR: invalid window parameters");
+			return false;
+		} 
+
+		var window=new Layout_Window(name,x,y,w,h);
+		window.window_position=windows.length;
+		window.layout_position=index;
+		windows_map[name.toUpperCase()]=windows.length;
+		windows.push(window);
+		return true;
 	}
 	
 	/* layout update loop */
 	this.cycle=function() {
-		for(var w=0;w<this.windows.length;w++) 
-			this.windows[w].cycle.apply(this,arguments);
+		for(var w=0;w<windows.length;w++) 
+			windows[w].cycle.apply(this,arguments);
 	}
 	
 	/* get a window by name */
 	this.window=function(name) {
-		if(this.windows_map[name.toUpperCase()] >= 0) {
-			return this.windows[this.windows_map[name.toUpperCase()]];
+		if(windows_map[name.toUpperCase()] >= 0) {
+			return windows[windows_map[name.toUpperCase()]];
 		} 
 		return false;
 	}
 	
 	/* return current window object */
 	this.current_window getter=function() {
-		return this.windows[this.index];
+		return windows[this.index];
 	}
 
 	/* set current window object by name */
 	this.current_window setter=function(name) {
-		if(this.windows_map[name.toUpperCase()] >= 0) {
-			this.index=this.windows_map[name.toUpperCase()];
+		if(windows_map[name.toUpperCase()] >= 0) {
+			this.index=windows_map[name.toUpperCase()];
 			return true;
 		} 
 		return false;
@@ -103,299 +138,428 @@ function Layout()
 	
 	/* draw all layout windows */
 	this.draw=function() {
-		for(var w=0;w<this.windows.length;w++)
-			this.windows[w].draw();
+		for(var w=0;w<windows.length;w++)
+			windows[w].drawWindow();
 	}
 	
 	/* handle layout commands/window commands */
-	this.handle_command=function(key) {
-		switch(key.toUpperCase()) {
+	this.handle_command=function(cmd) {
+		switch(cmd) {
 		case '\x09':	/* CTRL-I TAB */
-			this.windows[this.index].active=false;
-			this.windows[this.index].drawTitle();
-			this.index++;
-			if(this.index >= this.windows.length) this.index=0;
-			this.windows[this.index].active=true;
-			this.windows[this.index].drawTitle();
+			var old_index=this.index;
+			for(count=0;count<windows.length;count++) {
+				if(this.index+1>=windows.length)
+					this.index=0;
+				else 
+					this.index++;
+				if(windows[this.index].interactive) break;
+			}
+			windows[old_index].drawTitle();
+			windows[this.index].drawTitle();
 			return true;
 		default:
-			return this.windows[this.index].handle_command(key);
+			return windows[this.index].handle_command(cmd);
 		}
 	}
+
+	this.init(theme);
 }
 
-function Layout_Window(name)
+/* layout settings object */
+function Layout_Settings(wfg,wbg,wtfg,wtbg,bfg,bbg,tfg,tbg,hfg,hbg,afg,nfg,pfg)
+{
+	/* main window colors */
+	this.wfg=wfg;
+	this.wbg=wbg;
+	
+	/* title hightlight colors */
+	this.wtfg=wtfg;
+	this.wtbg=wtbg;
+
+	/* window border color */
+	this.bfg=bfg;
+	this.bbg=bbg;
+	
+	/* tab colors */
+	this.tfg=tfg;
+	this.tbg=tbg;
+	
+	/* tab highlight colors */
+	this.hfg=hfg;
+	this.hbg=hbg;
+	
+	/* tab alert color */
+	this.afg=afg;
+	
+	/* tab notice color */
+	this.nfg=nfg;
+	
+	/* tab user message color */
+	this.pfg=pfg;
+	
+	/* inactive window colors */
+	this.ibg=BG_BLACK;
+	this.ifg=DARKGRAY;
+}
+
+/* tabbed window object */
+function Layout_Window(name,x,y,w,h)
 {
 	this.name=name;
 
+	/* private array containing window tabs 
+		tabs can be anything that will fit in the window
+		such as: chat windows, user list, lightbar menus */
+	var tabs=[];
+	var tabs_map=[];
+	var index={ value:0 };
+	
+	/* private window properties */
+	var show_title=true;
+	var show_tabs=true;
+	var show_border=true;
+	var interactive=true;
+
 	/* main window position (upper left corner) */
-	this.x=1;
-	this.y=1;
+	this.x=x;
+	this.y=y;
 	
 	/* window dimensions */
-	this.width=79;
-	this.height=24;
+	this.width=w;
+	this.height=h;
 
-	/* 	array containing window tabs 
-		tabs can be anything that will fit in the window
-		such as: chat windows, user list, lightbar menus */
-	this.tabs=[];
-	this.tabs_map=[];
-	this.index=0;
-	this.active=false;
-	
-	this.scrollbar;
-	this.scrollback=-1;
-	
-	this.settings;
-	
-	/* initialize window settings */
-	this.init=function(x,y,w,h,sb,t) {
-	
-		/* if no parameters are supplied, initialize fullscreen */
-		if(!(x || y || w || h)) {
-			this.x=1;
-			this.y=1;
-			this.width=79;
-			this.height=24;
-			log(LOG_DEBUG, format("window initialized (x: %i y: %i w: %i h: %i)",this.x,this.y,this.width,this.height));
-		}
-		
-		/* verify window parameters */
-		else if(x <= 0 || y <= 0 
-			|| isNaN(x) || isNaN(y) 
-			|| (x+w) >= console.screen_columns
-			|| (y+h) >= console.screen_rows) {
-			log(LOG_WARNING, "ERROR: invalid or missing window parameters");
-			return false;
-		} 
-		
-		/* initialize window with supplied parameters */
-		else {
-			if(x) this.x=x;
-			if(y) this.y=y;
-			if(w) this.width=w;
-			if(h) this.height=h;
-			
-			log(LOG_DEBUG, format("window initialized (x: %i y: %i w: %i h: %i)",this.x,this.y,this.width,this.height));
-		}
-		
-		/* initialize scrollback */
-		if(sb > 0) {
-			this.scrollbar=new Scrollbar(this.x+this.width,this.y,this.height,"vertical","\1k\1h"); 
-			this.scrollback=sb;
-			
-			log(LOG_DEBUG, format("scrollback buffer set (%i)",sb));
-			log(LOG_DEBUG, format("scrollbar initialized (x: %i y: %i h: %i)",this.x+this.width,this.y,this.height));
-		}
-		
-		/* load theme, if specified */
-		if(t) {
-			//ToDo: create window_themes.ini
-		}
-		
-		/* otherwise, load default color scheme */
-		else {
-			this.settings=new Window_Settings(
-				LIGHTGRAY, /* window foreground */
-				BG_BLACK,	/* window background */
-				LIGHTBLUE,	/* window highlight foreground */
-				BG_BLUE,	/* window highlight background */
-				LIGHTGRAY,	/* border foreground */
-				BLACK,		/* tab foreground (normal) */
-				BG_LIGHTGRAY, /* tab background */
-				LIGHTRED,	/* tab highlight foreground */	
-				BG_RED,		/* tab highlight background */
-				RED,		/* tab alert foregruond */
-				MAGENTA,	/* tab update foreground */
-				BLUE		/* tab user msg foreground */
-			);
-		}
+	
+	/* public tab index */
+	this.index getter=function() {
+		return index.value;
+	}
+	
+	this.index setter=function(value) {
+		if(isNaN(value) || !tabs[value]) return false;
+		index.value=value;
+		return true;
 	}
 	
 	/* update loop */
 	this.cycle=function() {
-		for(var t=0;t<this.tabs.length;t++) 
-			if(typeof this.tabs[t].cycle == "function") 
-				this.tabs[t].cycle.apply(this,arguments);
+		for(var t=0;t<tabs.length;t++) 
+			if(typeof tabs[t].cycle == "function") 
+				tabs[t].cycle.apply(this,arguments);
 	}
 	
 	/* get a tab by name */
 	this.tab=function(name) {
-		if(this.tabs_map[name.toUpperCase()] >= 0) {
-			return this.tabs[this.tabs_map[name.toUpperCase()]];
+		if(tabs_map[name.toUpperCase()] >= 0) {
+			return tabs[tabs_map[name.toUpperCase()]];
 		} 
 		return false;
 	}
 	
+	/* toggle display options (can only be done prior to adding any tabs) */
+	this.show_title setter=function(bool) {
+		if(tabs.length > 0) return false;
+		show_title=bool;
+		return true;
+	}
+
+	this.show_tabs setter=function(bool) {
+		if(tabs.length > 0) return false;
+		show_tabs=bool;
+		return true;
+	}
+
+	this.show_border setter=function(bool) {
+		if(tabs.length > 0) return false;
+		show_border=bool;
+		return true;
+	}
+
+	this.interactive setter=function(bool)	 {
+		if(tabs.length > 0) return false;
+		interactive=bool;
+		return true;
+	}
+		
+	/* get display options */
+	this.show_border getter=function() {
+		return show_border;
+	}
+
+	this.show_title getter=function() {
+		return show_title;
+	}
+	
+	this.show_tabs getter=function() {
+		return show_tabs;
+	}
+
+	this.interactive getter=function() {
+		return interactive;
+	}
+	
 	/* return current tab object */
 	this.current_tab getter=function() {
-		return this.tabs[this.index];
+		return tabs[this.index];
 	}
 	
 	/* set current tab object */
 	this.current_tab setter=function(name) {
-		if(this.tabs_map[name.toUpperCase()] >= 0) {
-			this.index=this.tabs_map[name.toUpperCase()];
+		if(tabs_map[name.toUpperCase()] >= 0) {
+			this.index=tabs_map[name.toUpperCase()];
 			return true;
 		} 
 		return false;
 	}
 	
 	/* add a named tab to this window */
-	this.add=function(name) {
-	
-		/* if tab does not exist, create new tab */
-		if(!this.tabs_map[name.toUpperCase()] >= 0) {
-			this.index=this.tabs.length;
-			this.tabs_map[name.toUpperCase()]=this.tabs.length;
-			this.tabs.push(new Window_Tab(name,this.x+1,this.y+1,this.width-2,this.height-1));
-			log(LOG_DEBUG, "new tab created: " + name);
-			return true;
+	this.add_tab=function(type,name) {
+		if(!(type && name)) {
+			log(LOG_WARNING, "ERROR: invalid tab parameters");
+			return false;
 		}
-		
-		/* otherwise fail */
-		else {
+		if(tabs_map[name.toUpperCase()] >= 0) {
 			log(LOG_WARNING, "ERROR: a tab with this name already exists: " + name);
 			return false;
 		} 
+		
+		var tab=false;
+		var x=this.x;
+		var y=this.y;
+		var w=this.width;
+		var h=this.height;
+		
+		if(show_title) {
+			h-=1;
+			y+=1;
+		}
+		if(show_tabs) {
+			h-=1;
+			y+=1;
+		}
+		if(show_border) {
+			w-=2;
+			h-=2;
+			x+=1;
+			y+=1;
+		}
+		
+		switch(type.toUpperCase()) {
+		case "GRAPHIC":
+			tab=new Tab_Graphic(name,x,y,w,h);
+			break;
+		case "LIGHTBAR":
+			tab=new Tab_Lightbar(name,x,y,w,h);
+			break;
+		case "CHAT":
+			tab=new Tab_Chat(name,x,y,w,h);
+			break;
+		case "CUSTOM":
+			tab=new Window_Tab();
+			tab.setProperties(name,x,y,w,h);
+			tab.type="custom";
+		} 
+		
+		if(!tab) {
+			log(LOG_WARNING, "ERROR: invalid tab type specified");
+			return false;
+		}
+	
+		tabs_map[name.toUpperCase()]=tabs.length;
+		tabs.push(tab);
+		log(LOG_DEBUG, "new tab created: " + name);
+		return true;
 	}
 	
 	/* handle window commands */
-	this.handle_command=function(key) {
-		switch(key.toUpperCase()) {
+	this.handle_command=function(cmd) {
+		switch(cmd) {
 		case KEY_LEFT:
 			this.index--;
-			if(this.index < 0) this.index=this.tabs.length-1;
-			this.drawTitle();
+			if(this.index < 0) this.index=tabs.length-1;
+			this.drawTabs();
 			this.draw();
 			return true;
 		case KEY_RIGHT:
 			this.index++;
-			if(this.index >= this.tabs.length) this.index=0;
-			this.drawTitle();
+			if(this.index >= tabs.length) this.index=0;
+			this.drawTabs();
 			this.draw();
 			return true;
 		default:
-			if(typeof this.tabs[this.index].handle_command == "function")
-				return this.tabs[this.index].handle_command(key);
+			if(tabs[this.index] &&
+				typeof tabs[this.index].handle_command == "function")
+				return tabs[this.index].handle_command(cmd);
 			return false;
 		}
 	}
 	
 	/* draw the window and contents of the currently active tab */
 	this.drawWindow=function() {
-		this.drawTitle();
-		this.drawBorder();
-		this.drawWindow();
+		if(this.show_border) this.drawBorder();
+		if(this.show_title) this.drawTitle();
+		if(this.show_tabs) this.drawTabs();
+		this.draw();
 	}
 	
-	/* draw the title bar of the current window */
-	this.drawTitle=function() {	
-		var title_str=getColor(this.settings.tbg) + getColor(BLACK);
-		title_str+=" \xDD";
-		if(this.active == true) 
-			title_str+=getColor(this.settings.whbg) + getColor(this.settings.whbg);
-		else 
-			title_str+=getColor(BG_BLACK) + getColor(DARKGRAY);
-		title_str+=this.name;
-		var title_str=getColor(this.settings.tbg) + getColor(BLACK);
-		title_str+="\xDe";
-		for(var t=0;t<this.tabs.length;t++) {
-			if(this.tabs[t].active == true) {
-				title_str+=getColor(this.settings.hbg) + getColor(this.settings.hfg);
+	/* draw the tab list for the current window */
+	this.drawTabs=function() {
+		var tab_str="\1n" + getColor(layout_settings.tbg) + getColor(layout_settings.tfg) + "<";
+		for(var t=0;t<tabs.length;t++) {
+			tab_str+="\1n" + getColor(layout_settings.tbg) + " ";
+			if(t == this.index) {
+				tab_str+=getColor(layout_settings.hbg) + getColor(layout_settings.hfg);
 			} else {
-				switch(this.tabs[t].status) {
+				switch(tabs[t].status) {
 				case -1:
-					title_str+=getColor(this.settings.tbg) + getColor(this.settings.tfg);
+					tab_str+=getColor(layout_settings.tfg);
 					break;
 				case 0:
-					title_str+=getColor(this.settings.tbg) + getColor(this.settings.nfg);
+					tab_str+=getColor(layout_settings.nfg);
 					break;
 				case 1:
-					title_str+=getColor(this.settings.tbg) + getColor(this.settings.afg);
+					tab_str+=getColor(layout_settings.afg);
 					break;
 				case 2:
-					title_str+=getColor(this.settings.tbg) + getColor(this.settings.pfg);
+					tab_str+=getColor(layout_settings.pfg);
 					break;
 				}
 			}
-			title_str+=this.tabs[t].name + " ";
+			tab_str+=tabs[t].name;
 		}
-		title_str+=getColor(this.settings.tbg) + getColor(this.settings.tfg);
-
-		console.gotoxy(this.x,this.y);
-		console.putmsg(printPadded(title_str,this.width-1) + "x");
+		tab_str+="\1n" + getColor(layout_settings.tbg) + getColor(layout_settings.tfg);
+		
+		var x=this.x;
+		var y=this.y;
+		var w=this.width;
+		
+		if(this.show_title) y+=1;
+		if(this.show_border) {
+			x+=1;
+			y+=1;
+			w-=2;
+		}
+		console.gotoxy(x,y);
+		console.putmsg(printPadded(tab_str,w-1) + ">",P_SAVEATR);
+	}
+	
+	/* draw the title bar of the current window */
+	this.drawTitle=function() {
+		var color_str="";
+		if(this.window_position == this.layout_position.value) {
+			color_str+=getColor(layout_settings.wtbg) 
+				+ getColor(layout_settings.wtfg); 
+		} else {
+			color_str+=getColor(layout_settings.ibg) 
+				+ getColor(layout_settings.ifg);
+		}
+		var x=this.x;
+		var y=this.y;
+		var w=this.width;
+		
+		if(this.show_border) {
+			x+=1;
+			y+=1;
+			w-=2;
+		}
+		
+		console.gotoxy(x,y);
+		console.putmsg(color_str + centerString(this.name,w),P_SAVEATR);
 	}
 	
 	/* draw the border of the current window */
 	this.drawBorder=function() {
-		setPosition(this.x,this.y+1);
-		console.attributes=BG_BLACK + this.settings.bfg;
-		for(var y=0;y<this.height-1;y++) {
-			pushMessage(splitPadded("\xDD","\xDE",this.width));
+		var border_color=getColor(layout_settings.bbg) + getColor(layout_settings.bfg);
+		setPosition(this.x,this.y);
+		pushMessage(splitPadded(border_color + "\xDA","\xBF",this.width,"\xC4"));
+		for(var y=0;y<this.height-2;y++) {
+			pushMessage(splitPadded(border_color + "\xB3","\xB3",this.width));
 		}
+		pushMessage(splitPadded(border_color + "\xC0","\xD9",this.width,"\xC4"));
 	}
 	
 	/* draw the contents of the current window */
 	this.draw=function() {
-		clearBlock(this.x,this.y,this.w,this.h,this.settings.bg);
-		if(typeof this.tabs[this.index].draw == "function") 
-			this.tabs[this.index].draw.apply(this,this.x+1,this.y+1,this.width-2,this.height-1);
+		if(tabs[this.index] &&
+			typeof tabs[this.index].draw == "function") {
+			tabs[this.index].clear();
+			tabs[this.index].draw.apply(this,arguments);
+		}
 	}
-}
 
-function Window_Settings(wfg,wbg,whfg,whbg,bfg,tfg,tbg,hfg,hbg,afg,nfg,pfg)
-{
-	/* main window colors */
-	this.wfg=wfg;
-	this.wbg=wbg;
-	
-	/* window hightlight colors */
-	this.whfg=whfg;
-	this.whbg=whbg;
-
-	/* window border color */
-	this.bfg=bfg;
-	
-	/* tab colors */
-	this.tfg=tfg;
-	this.tbg=tbg;
-	
-	/* tab highlight colors */
-	this.hfg=hfg;
-	this.hbg=hbg;
-	
-	/* tab alert color */
-	this.afg=afg;
-	
-	/* tab notice color */
-	this.nfg=nfg;
-	
-	/* tab user message color */
-	this.pfg=pfg;
-	
-	/* inactive window colors */
-	this.ibg=BG_BLACK;
-	this.ifg=DARKGRAY;
+	log(LOG_DEBUG, format("window initialized (x: %i y: %i w: %i h: %i)",this.x,this.y,this.width,this.height));
 }
-
-function Window_Tab(name,x,y,w,h)
+ 
+/* window tab prototype object */
+function Window_Tab()
 {
-	this.name=name;
 	this.status=-1;
-	this.active=false;
 
 	/* dynamic content and command processor placeholders */
 	this.handle_command;
 	this.cycle;
 	this.draw;
 	
-	this.init=function(draw,handle_command,cycle)
+	this.clear=function()
+	{
+		clearBlock(this.x,this.y,this.width,this.height,layout_settings.bg);
+	}
+	
+	this.setProperties=function(name,x,y,w,h)
 	{
-		this.draw=draw;
-		this.handle_command=handle_command;
-		this.cycle=cycle;
+		this.name=name;
+		this.x=x;
+		this.y=y;
+		this.width=w;
+		this.height=h;
 	}
 }
 
+/* chat tab object extends Window_Tab */
+function Tab_Chat(name,x,y,w,h)
+{
+	if(!chat) {
+		load("chateng.js");
+		js.global.chat=new ChatEngine();
+	}
+	this.setProperties(name,x,y,w,h);
+	this.type="chat";
+	
+	this.init=function(chatroom)
+	{
+		chatroom.init(this.x,this.y,this.width,this.height);
+		this.chatroom=chatroom;
+	}
+}
+Tab_Chat.prototype=new Window_Tab;
+
+/* graphic tab object extends Window_Tab */
+function Tab_Graphic(name,x,y,w,h)
+{
+	if(!Graphic) {
+		load("graphic.js");
+	}
+	this.setProperties(name,x,y,w,h);
+	this.type="graphic";
+	this.graphic=new Graphic(w,h,layout_settings.wbg);
+	
+	this.putmsg=this.graphic.putmsg;
+	this.load=this.graphic.load;
+	this.draw=function() {
+		this.graphic.draw(this.x,this.y);
+	}
+}
+Tab_Graphic.prototype=new Window_Tab;
+
+/* lightbar tab object extends Window_Tab */
+function Tab_Lightbar(name,x,y,w,h)
+{
+	if(!Lightbar) {
+		load("lightbar.js");
+	}
+	this.setProperties(name,x,y,w,h);
+	this.type="lightbar";
+	this.load=function(lightbar) {
+		//ToDo: add lightbar tab native support
+	}
+}
+Tab_Lightbar.prototype=new Window_Tab;