diff --git a/gluturtle.cabal b/gluturtle.cabal
--- a/gluturtle.cabal
+++ b/gluturtle.cabal
@@ -2,7 +2,7 @@
 cabal-version:	>= 1.6
 
 name:		gluturtle
-version:	0.0.19
+version:	0.0.20
 stability:	alpha
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
diff --git a/src/Graphics/UI/GLUT/Turtle/Field.hs b/src/Graphics/UI/GLUT/Turtle/Field.hs
--- a/src/Graphics/UI/GLUT/Turtle/Field.hs
+++ b/src/Graphics/UI/GLUT/Turtle/Field.hs
@@ -75,6 +75,7 @@
 import Control.Concurrent(ThreadId, forkIO)
 import Data.IORef(IORef, newIORef, readIORef, writeIORef)
 import Data.IORef.Tools(atomicModifyIORef_)
+import Data.Maybe
 
 --------------------------------------------------------------------------------
 
@@ -87,8 +88,9 @@
 data Field = Field{
 	fCoordinates :: Coordinates,
 
+	fBgcolor :: IORef [Color],
 	fAction :: IORef (IO ()),
-	fActions :: IORef [IO ()],
+	fActions :: IORef [Maybe (IO ())],
 
 	fString :: IORef [String],
 	fString2 :: IORef [String],
@@ -114,13 +116,20 @@
 --------------------------------------------------------------------------------
 
 undoField :: Field -> IO ()
-undoField f = atomicModifyIORef_ (fActions f) tail
+undoField f = do
+	a : _ <- readIORef $ fActions f
+	when (isNothing a) $ atomicModifyIORef_ (fBgcolor f) tail
+	atomicModifyIORef_ (fActions f) myTail
 
+myTail [] = error "myTail failed"
+myTail (x : xs) = xs
+
 openField :: String -> Int -> Int -> IO Field
 openField name w h = do
 	layers <- newLayers 0 (return ()) (return ()) (return ())
+	bgc <- newIORef $ [RGB 255 255 255]
 	action <- newIORef $ return ()
-	actions <- newIORef [makeFieldColor $ RGB 255 255 255]
+	actions <- newIORef [] -- [makeFieldColor $ RGB 255 255 255]
 	str <- newIORef [""]
 	str2 <- newIORef []
 	inputtext <- newIORef $ const $ return True
@@ -132,14 +141,15 @@
 	wt <- createWindow name
 	wc <- createWindow "console"
 	currentWindow $= Just wt
-	displayCallback $= (sequence_ =<< readIORef actions)
+	displayCallback $= (sequence_ . catMaybes =<< readIORef actions)
 	currentWindow $= Just wc
-	displayCallback $= (sequence_ =<< readIORef actions)
+	displayCallback $= (sequence_ . catMaybes =<< readIORef actions)
 	G.addTimerCallback 10 (timerAction $ do
 		currentWindow $= Just wt
 		G.clearColor $= G.Color4 0 0 0 0
 		G.clear [G.ColorBuffer]
-		sequence_ . reverse =<< readIORef actions
+		makeFieldColor . head =<< readIORef bgc
+		sequence_ . reverse . catMaybes =<< readIORef actions
 		join $ readIORef action
 		swapBuffers
 		currentWindow $= Just wc
@@ -163,7 +173,9 @@
 		fInputtext = inputtext,
 		fFieldWindow = wt,
 		fConsoleWindow = wc,
-		fPrompt = prmpt
+		fPrompt = prmpt,
+
+		fBgcolor = bgc
 	 }
 	G.keyboardMouseCallback $= Just (keyboardProc f)
 	return f
@@ -211,9 +223,15 @@
 flushField _f _real act = act
 
 fieldColor :: Field -> Layer -> Color -> IO ()
-fieldColor f _l clr =
-	atomicModifyIORef_ (fActions f) ((++ [makeFieldColor clr]) . init)
+fieldColor f _l clr = do
+--	atomicModifyIORef_ (fActions f) ((++ [makeFieldColor clr]) . myInit)
+	atomicModifyIORef_ (fBgcolor f) (clr :)
+	atomicModifyIORef_ (fActions f) (Nothing :)
 
+myInit [] = error "myInit failed"
+myInit [x] = []
+myInit (x : xs) = x : myInit xs
+
 makeFieldColor clr = preservingMatrix $ do
 	G.color $ colorToColor4 clr
 	renderPrimitive Quads $ mapM_ vertex [
@@ -226,7 +244,7 @@
 
 drawLine :: Field -> Layer -> Double -> Color -> Position -> Position -> IO ()
 drawLine f _ w c p q = do
-	atomicModifyIORef_ (fActions f) (makeLineAction f p q c w :)
+	atomicModifyIORef_ (fActions f) (Just (makeLineAction f p q c w) :)
 --	G.addTimerCallback 1 $ makeLineAction p q c
 --	swapBuffers
 	flush
@@ -285,7 +303,7 @@
 writeString :: Field -> Layer -> String -> Double -> Color -> Position ->
 	String -> IO ()
 writeString f _ _fname size clr (Center x_ y_) str =
-	atomicModifyIORef_ (fActions f) (action :)
+	atomicModifyIORef_ (fActions f) (Just action :)
 	where
 	action = preservingMatrix $ do
 		let	size' = size / 15
@@ -315,7 +333,7 @@
 
 fillPolygon :: Field -> Layer -> [Position] -> Color -> Color -> Double -> IO ()
 fillPolygon f _ ps clr lc lw =
-	atomicModifyIORef_ (fActions f) (makeCharacterAction f ps clr lc lw :)
+	atomicModifyIORef_ (fActions f) (Just (makeCharacterAction f ps clr lc lw) :)
 
 --------------------------------------------------------------------------------
 
diff --git a/tests/testGLUT.hs b/tests/testGLUT.hs
--- a/tests/testGLUT.hs
+++ b/tests/testGLUT.hs
@@ -44,4 +44,5 @@
 processInput _ t "bred" = bgcolor t ((255, 0, 0) :: (Int, Int, Int)) >> return True
 processInput _ t "bgreen" = bgcolor t ((0, 255, 0) :: (Int, Int, Int)) >> return True
 processInput _ t "home" = goto t 0 0 >> return True
+processInput _ t "undo" = undo t >> return True
 processInput _ _ _ = return True
