diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx
index 7051e6795..d2329af9d 100644
--- a/src/Main/fg_init.cxx
+++ b/src/Main/fg_init.cxx
@@ -57,7 +57,6 @@
 
 #include <Aircraft/aircraft.hxx>
 #include <Airports/simple.hxx>
-#include <Astro/skydome.hxx>
 #include <Astro/stars.hxx>
 #include <Astro/solarsystem.hxx>
 #include <Autopilot/autopilot.hxx>
@@ -71,6 +70,7 @@
 #include <Joystick/joystick.hxx>
 #include <Scenery/scenery.hxx>
 #include <Scenery/tilemgr.hxx>
+#include <Sky/skydome.hxx>
 #include <Time/event.hxx>
 #include <Time/fg_time.hxx>
 #include <Time/light.hxx>
diff --git a/src/Main/main.cxx b/src/Main/main.cxx
index ad019ceb3..3bf58b5f6 100644
--- a/src/Main/main.cxx
+++ b/src/Main/main.cxx
@@ -74,7 +74,6 @@
 #include <Include/general.hxx>
 
 #include <Aircraft/aircraft.hxx>
-#include <Astro/skydome.hxx>
 #include <Astro/stars.hxx>
 #include <Astro/solarsystem.hxx>
 
@@ -88,6 +87,8 @@
 #include <Objects/materialmgr.hxx>
 #include <Scenery/scenery.hxx>
 #include <Scenery/tilemgr.hxx>
+#include <Sky/skydome.hxx>
+#include <Sky/sphere.hxx>
 #include <Time/event.hxx>
 #include <Time/fg_time.hxx>
 #include <Time/fg_timer.hxx>
@@ -145,10 +146,6 @@ ssgBranch *terrain = NULL;
 ssgSelector *penguin_sel = NULL;
 ssgTransform *penguin_pos = NULL;
 
-// the sky needs to be drawn in a specific order, thus we use several
-// "roots" so we can explicitely control this.
-ssgRoot *sky = NULL;
-
 #ifdef FG_NETWORK_OLK
 ssgSelector *fgd_sel = NULL;
 ssgTransform *fgd_pos = NULL;
@@ -188,6 +185,31 @@ sgMat4 copy_of_ssgOpenGLAxisSwapMatrix =
 //
 
 
+ssgSimpleState *default_state;
+ssgSimpleState *hud_and_panel;
+ssgSimpleState *menus;
+
+void fgBuildRenderStates( void ) {
+    default_state = new ssgSimpleState;
+    default_state->disable( GL_TEXTURE_2D );
+    default_state->enable( GL_CULL_FACE );
+    default_state->disable( GL_COLOR_MATERIAL );
+    default_state->disable( GL_BLEND );
+    default_state->disable( GL_ALPHA_TEST );
+    default_state->disable( GL_LIGHTING );
+
+    hud_and_panel = new ssgSimpleState;
+    hud_and_panel->disable( GL_CULL_FACE );
+    hud_and_panel->disable( GL_TEXTURE_2D );
+    hud_and_panel->disable( GL_LIGHTING );
+
+    menus = new ssgSimpleState;
+    menus->disable( GL_CULL_FACE );
+    menus->disable( GL_TEXTURE_2D );
+    menus->enable( GL_BLEND );
+}
+
+
 // fgInitVisuals() -- Initialize various GL/view parameters
 void fgInitVisuals( void ) {
     fgLIGHT *l;
@@ -310,6 +332,7 @@ void fgRenderFrame( void ) {
 	// ssg does to set up the model view matrix
 	xglMatrixMode(GL_MODELVIEW);
 	xglLoadIdentity();
+	ssgSetCamera( current_view.VIEW );
 
 	/*
 	sgMat4 vm_tmp, view_mat;
@@ -319,42 +342,48 @@ void fgRenderFrame( void ) {
 	xglLoadMatrixf( (float *)view_mat );
 	*/
 
+	// set the opengl state to known default values
+	default_state->force();
+
 	// draw sky
 	xglDisable( GL_DEPTH_TEST );
-	// xglDisable( GL_LIGHTING );
-	xglDisable( GL_CULL_FACE );
 	xglDisable( GL_FOG );
-	xglDisable( GL_TEXTURE_2D );
+	// xglDisable( GL_TEXTURE_2D );
+	// xglDisable( GL_LIGHTING );
+	// xglDisable( GL_CULL_FACE );
+	// xglShadeModel( GL_SMOOTH );
+
 	/* if ( current_options.get_fog() > 0 ) {
 	    xglEnable( GL_FOG );
 	    xglFogi( GL_FOG_MODE, GL_EXP2 );
 	    xglFogfv( GL_FOG_COLOR, l->adj_fog_color );
 	} */
 
-	xglShadeModel( GL_SMOOTH );
 
-	// if ( current_options.get_skyblend() ) {
-	//    fgSkyRender();
-	// }
-	sgVec3 zero_elev;
-	sgSetVec3( zero_elev,
-		   current_view.get_cur_zero_elev().x(),
-		   current_view.get_cur_zero_elev().y(),
-		   current_view.get_cur_zero_elev().z() );
+	if ( current_options.get_skyblend() ) {
+	    // fgSkyRender();
 
-	current_sky.repaint( cur_light_params.sky_color,
-			     cur_light_params.fog_color,
-			     cur_light_params.sun_angle );
+	    sgVec3 zero_elev;
+	    sgSetVec3( zero_elev,
+		       current_view.get_cur_zero_elev().x(),
+		       current_view.get_cur_zero_elev().y(),
+		       current_view.get_cur_zero_elev().z() );
 
-	current_sky.reposition( zero_elev, 
-				cur_fdm_state->get_Longitude(),
-				cur_fdm_state->get_Latitude(),
-				cur_light_params.sun_rotation );
+	    current_sky.repaint( cur_light_params.sky_color,
+				 cur_light_params.fog_color,
+				 cur_light_params.sun_angle );
 
-	xglPushMatrix();
-	ssgSetCamera( current_view.VIEW );
-	ssgCullAndDraw( sky );
-	xglPopMatrix();
+	    current_sky.reposition( zero_elev, 
+				    cur_fdm_state->get_Longitude(),
+				    cur_fdm_state->get_Latitude(),
+				    cur_light_params.sun_rotation );
+
+	    xglPushMatrix();
+
+	    current_sky.draw();
+
+	    xglPopMatrix();
+	}
 
 	// xglDisable( GL_FOG );
 
@@ -385,11 +414,11 @@ void fgRenderFrame( void ) {
 	*/
 
 	// draw scenery
-	if ( current_options.get_shading() ) {
+	/* if ( current_options.get_shading() ) {
 	    xglShadeModel( GL_SMOOTH ); 
 	} else {
 	    xglShadeModel( GL_FLAT ); 
-	}
+	} */
 	xglEnable( GL_DEPTH_TEST );
 	if ( current_options.get_fog() > 0 ) {
 	    xglEnable( GL_FOG );
@@ -495,7 +524,7 @@ void fgRenderFrame( void ) {
 	// xglLightfv(GL_LIGHT0, GL_SPECULAR, white );
 
 	// texture parameters
-	xglEnable( GL_TEXTURE_2D );
+	// xglEnable( GL_TEXTURE_2D );
 	xglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
 	xglHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
 	// set base color (I don't think this is doing anything here)
@@ -504,26 +533,6 @@ void fgRenderFrame( void ) {
 	// xglMaterialfv (GL_FRONT, GL_SPECULAR, white);
 	// xglMaterialfv (GL_FRONT, GL_SHININESS, mat_shininess);
 
-#if 0	
-	if ( current_options.get_textures() ) {
-	    // texture parameters
-	    xglEnable( GL_TEXTURE_2D );
-	    xglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
-	    xglHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
-	    // set base color (I don't think this is doing anything here)
-	    xglMaterialfv (GL_FRONT, GL_AMBIENT, white);
-	    xglMaterialfv (GL_FRONT, GL_DIFFUSE, white);
-	    // xglMaterialfv (GL_FRONT, GL_SPECULAR, white);
-	    // xglMaterialfv (GL_FRONT, GL_SHININESS, mat_shininess);
-	} else {
-	    xglDisable( GL_TEXTURE_2D );
-	    xglMaterialfv (GL_FRONT, GL_AMBIENT, terrain_color);
-	    xglMaterialfv (GL_FRONT, GL_DIFFUSE, terrain_color);
-	    // xglMaterialfv (GL_FRONT, GL_AMBIENT, white);
-	    // xglMaterialfv (GL_FRONT, GL_DIFFUSE, white);
-	}
-#endif
-
 	sgVec3 sunpos;
 	sgSetVec3( sunpos, l->sun_vec[0], l->sun_vec[1], l->sun_vec[2] );
 	ssgGetLight( 0 ) -> setPosition( sunpos );
@@ -619,20 +628,23 @@ void fgRenderFrame( void ) {
 	// draw the ssg scene
 	ssgCullAndDraw( scene );
 
-	xglDisable( GL_TEXTURE_2D );
-	xglDisable( GL_FOG );
 
 	// display HUD && Panel
-	xglDisable( GL_CULL_FACE );
+	xglDisable( GL_FOG );
+	xglDisable( GL_DEPTH_TEST );
+	// xglDisable( GL_CULL_FACE );
+	// xglDisable( GL_TEXTURE_2D );
+	hud_and_panel->apply();
 	fgCockpitUpdate();
 
 	// We can do translucent menus, so why not. :-)
-	xglEnable    ( GL_BLEND ) ;
+	// xglEnable ( GL_BLEND ) ;
+	menus->apply();
 	xglBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
 	puDisplay();
-	xglDisable   ( GL_BLEND ) ;
-	xglEnable( GL_FOG );
+	// xglDisable ( GL_BLEND ) ;
 
+	// xglEnable( GL_FOG );
     }
 
     xglutSwapBuffers();
@@ -1345,16 +1357,16 @@ int main( int argc, char **argv ) {
     terrain->setName( "Terrain" );
     scene->addKid( terrain );
 
-    // Sky branch
-    sky = new ssgRoot;
-    sky->setName( "Sky" );
-    current_sky.initialize( sky );
+    // Initialize the sky
+    current_sky.initialize();
 
     // temporary visible aircraft "own ship"
     penguin_sel = new ssgSelector;
     penguin_pos = new ssgTransform;
-    ssgEntity *tux_obj = ssgLoadAC( "glider.ac" );
+    ssgBranch *tux_obj = ssgMakeSphere( 10.0, 10, 10 );
+    // ssgEntity *tux_obj = ssgLoadAC( "glider.ac" );
     // ssgEntity *tux_obj = ssgLoadAC( "Tower1x.ac" );
+
     penguin_pos->addKid( tux_obj );
     penguin_sel->addKid( penguin_pos );
     ssgFlatten( tux_obj );
@@ -1369,6 +1381,9 @@ int main( int argc, char **argv ) {
     }
 #endif
 
+    // build our custom render states
+    fgBuildRenderStates();
+
     // pass control off to the master GLUT event handler
     glutMainLoop();
 
diff --git a/src/Makefile.am b/src/Makefile.am
index cb6551b3d..a1ab792e6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -25,6 +25,7 @@ SUBDIRS = \
         $(NETWORK_DIRS) \
         Objects \
         Scenery \
+	Sky \
         Time \
         $(WEATHER_DIR) \
         Main
diff --git a/src/Objects/materialmgr.cxx b/src/Objects/materialmgr.cxx
index 88a7028b4..2a73daf07 100644
--- a/src/Objects/materialmgr.cxx
+++ b/src/Objects/materialmgr.cxx
@@ -197,7 +197,7 @@ fgMATERIAL_MGR::load_lib ( void )
 		textured->setShadeModel( GL_FLAT );
 	    }
 
-	    textured->enable ( GL_CULL_FACE      ) ;
+	    textured->enable ( GL_CULL_FACE ) ;
 	    textured->enable( GL_TEXTURE_2D );
 	    textured->setTexture( (char *)tex_file.c_str() );
 	    textured->setMaterial ( GL_AMBIENT_AND_DIFFUSE, 1, 1, 1, 1 ) ;