diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
-# Revision history for tart
 
-## 0.1  -- YYYY-mm-dd
+0.1.1
+-----
 
-* First version. Released on an unsuspecting world.
+ * Added a new saving UI and keybinding to trigger it (C-s). Previously
+   the only opportunity to save was on quitting.
+
+0.1
+---
+
+* First version.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,8 +1,6 @@
 tart - terminal art program
 ===========================
 
-**NOTE: This is unreleased software and is under heavy development. Use at your own risk.**
-
 ```
  _____  _    ____ _____  _
 (_   _)/ \  |    (_   _)| |
@@ -92,7 +90,8 @@
 - `C-l`: toggle visibility of layer list
 
 General:
-- `q`: quit
+- `q`: quit (and optionally save)
+- `C-s`: save
 - `u`: undo
 - `r`: redo
 - OS paste: paste text into canvas
diff --git a/programs/App.hs b/programs/App.hs
--- a/programs/App.hs
+++ b/programs/App.hs
@@ -107,16 +107,19 @@
 application =
     App { appDraw = drawUI
         , appChooseCursor = \s locs ->
-            if | CanvasSizePrompt `elem` s^.modes -> do
-                   cur <- focusGetCurrent (s^.canvasSizeFocus)
-                   showCursorNamed cur locs
-               | AskToSave `elem` s^.modes ->
-                   showCursorNamed AskToSaveFilenameEdit locs
-               | TextEntry `elem` s^.modes ->
-                   showCursorNamed TextEntryCursor locs
-               | RenameLayer `elem` s^.modes ->
-                   showCursorNamed LayerNameEditor locs
-               | otherwise -> Nothing
+            let isSaving = any isSavingMode
+                isSavingMode (AskForSaveFilename _) = True
+                isSavingMode _ = False
+            in if | CanvasSizePrompt `elem` s^.modes -> do
+                      cur <- focusGetCurrent (s^.canvasSizeFocus)
+                      showCursorNamed cur locs
+                  | isSaving (s^.modes) ->
+                      showCursorNamed AskToSaveFilenameEdit locs
+                  | TextEntry `elem` s^.modes ->
+                      showCursorNamed TextEntryCursor locs
+                  | RenameLayer `elem` s^.modes ->
+                      showCursorNamed LayerNameEditor locs
+                  | otherwise -> Nothing
         , appHandleEvent = handleEvent
         , appStartEvent = \s -> do
             vty <- getVtyHandle
diff --git a/programs/Events.hs b/programs/Events.hs
--- a/programs/Events.hs
+++ b/programs/Events.hs
@@ -58,7 +58,7 @@
                 CharacterSelect      -> handleCharacterSelectEvent st ev
                 CanvasSizePrompt     -> handleCanvasSizePromptEvent st ev
                 AskToSave            -> handleAskToSaveEvent st ev
-                AskForSaveFilename   -> handleAskForSaveFilenameEvent st ev
+                AskForSaveFilename q -> handleAskForSaveFilenameEvent q st ev
                 TextEntry            -> handleTextEntryEvent st ev
                 BoxStyleSelect       -> handleBoxStyleSelectEvent st ev
                 StyleSelect          -> handleStyleSelectEvent st ev
diff --git a/programs/Events/AskForSaveFilename.hs b/programs/Events/AskForSaveFilename.hs
--- a/programs/Events/AskForSaveFilename.hs
+++ b/programs/Events/AskForSaveFilename.hs
@@ -13,16 +13,19 @@
 import Types
 import State
 
-handleAskForSaveFilenameEvent :: AppState -> BrickEvent Name e -> EventM Name (Next AppState)
-handleAskForSaveFilenameEvent s (VtyEvent (V.EvKey V.KEsc [])) =
-    halt s
-handleAskForSaveFilenameEvent s (VtyEvent (V.EvKey V.KEnter [])) = do
+handleAskForSaveFilenameEvent :: Bool -> AppState -> BrickEvent Name e -> EventM Name (Next AppState)
+handleAskForSaveFilenameEvent isQuitting s (VtyEvent (V.EvKey V.KEsc [])) =
+    if isQuitting then halt s else continue $ popMode s
+handleAskForSaveFilenameEvent isQuitting s (VtyEvent (V.EvKey V.KEnter [])) = do
     let [fn] = getEditContents (s^.askToSaveFilenameEdit)
     if T.null fn
-        then halt s
-        else quit False $ s & canvasPath .~ Just (T.unpack fn)
-handleAskForSaveFilenameEvent s (VtyEvent e) =
+        then if isQuitting then halt s else continue $ popMode s
+        else let s' = s & canvasPath .~ Just (T.unpack fn)
+             in if isQuitting
+                then quit False s'
+                else continue =<< (popMode <$> saveAndContinue s')
+handleAskForSaveFilenameEvent _ s (VtyEvent e) =
     continue =<< handleEventLensed s askToSaveFilenameEdit handleEditorEvent e
-handleAskForSaveFilenameEvent s _ =
+handleAskForSaveFilenameEvent _ s _ =
     continue s
 
diff --git a/programs/Events/AskToSave.hs b/programs/Events/AskToSave.hs
--- a/programs/Events/AskToSave.hs
+++ b/programs/Events/AskToSave.hs
@@ -16,6 +16,6 @@
 handleAskToSaveEvent s (VtyEvent (V.EvKey (V.KChar 'n') [])) =
     halt s
 handleAskToSaveEvent s (VtyEvent (V.EvKey (V.KChar 'y') [])) =
-    continue $ askForSaveFilename s
+    continue $ askForSaveFilename True s
 handleAskToSaveEvent s _ =
     continue s
diff --git a/programs/Events/Main.hs b/programs/Events/Main.hs
--- a/programs/Events/Main.hs
+++ b/programs/Events/Main.hs
@@ -79,6 +79,7 @@
         (V.EvKey (V.KChar 'd') []) -> return $ canvasMoveRight s
         (V.EvKey (V.KChar 'y') []) -> return $ beginStyleSelect s
         (V.EvKey (V.KChar 'v') []) -> return $ beginCanvasSizePrompt s
+        (V.EvKey (V.KChar 's') [V.MCtrl]) -> return $ askForSaveFilename False s
         (V.EvKey (V.KChar 'r') [V.MCtrl]) -> return $ beginLayerRename s
         (V.EvKey (V.KChar 'x') [V.MCtrl]) -> return $ deleteSelectedLayer s
         (V.EvKey (V.KChar 'n') [V.MCtrl]) -> return $ selectNextLayer s
diff --git a/programs/State.hs b/programs/State.hs
--- a/programs/State.hs
+++ b/programs/State.hs
@@ -59,6 +59,7 @@
   , moveCurrentLayerUp
   , cancelDragging
   , toggleLayerList
+  , saveAndContinue
 
   , canvasMoveDown
   , canvasMoveUp
@@ -368,12 +369,23 @@
                     if ask
                     then continue $ askToSave s
                     else do
-                        let ls = snd <$> (sortOn fst $ M.toList $ s^.layers)
-                        liftIO $ writeCanvasFiles p ls (s^.layerOrder)
-                                    (_layerName <$> snd <$> (sortOn fst $ M.toList $ s^.layerInfo))
+                        liftIO $ saveToDisk s p
                         halt s
         False -> halt s
 
+saveToDisk :: AppState -> FilePath -> IO ()
+saveToDisk s p = do
+    let ls = snd <$> (sortOn fst $ M.toList $ s^.layers)
+    writeCanvasFiles p ls (s^.layerOrder)
+        (_layerName <$> snd <$> (sortOn fst $ M.toList $ s^.layerInfo))
+
+saveAndContinue :: AppState -> EventM Name AppState
+saveAndContinue s = do
+    case s^.canvasPath of
+        Nothing -> return ()
+        Just p -> liftIO $ saveToDisk s p
+    return $ s & canvasDirty .~ False
+
 writeCanvasFiles :: FilePath -> [Canvas] -> [Int] -> [String] -> IO ()
 writeCanvasFiles path cs order names = do
     let tf = TartFile cs names order
@@ -385,9 +397,9 @@
 askToSave s =
     pushMode AskToSave s
 
-askForSaveFilename :: AppState -> AppState
-askForSaveFilename s =
-    pushMode AskForSaveFilename $
+askForSaveFilename :: Bool -> AppState -> AppState
+askForSaveFilename shouldQuit s =
+    pushMode (AskForSaveFilename shouldQuit) $
         s & askToSaveFilenameEdit .~ applyEdit gotoEOL (editor AskToSaveFilenameEdit (Just 1) $
                                      T.pack $ maybe "" id $ s^.canvasPath)
 
diff --git a/programs/Types.hs b/programs/Types.hs
--- a/programs/Types.hs
+++ b/programs/Types.hs
@@ -103,7 +103,7 @@
           | BoxStyleSelect
           | CanvasSizePrompt
           | AskToSave
-          | AskForSaveFilename
+          | AskForSaveFilename Bool
           | TextEntry
           | RenameLayer
           deriving (Eq, Show)
diff --git a/programs/UI.hs b/programs/UI.hs
--- a/programs/UI.hs
+++ b/programs/UI.hs
@@ -33,7 +33,7 @@
         CharacterSelect      -> drawCharacterSelectUI s
         CanvasSizePrompt     -> drawCanvasSizePromptUI s
         AskToSave            -> drawAskToSaveUI s
-        AskForSaveFilename   -> drawAskForSaveFilenameUI s
+        AskForSaveFilename q -> drawAskForSaveFilenameUI q s
         TextEntry            -> drawTextEntryUI s
         BoxStyleSelect       -> drawBoxStyleSelectUI s
         StyleSelect          -> drawStyleSelectUI s
diff --git a/programs/UI/AskForSaveFilename.hs b/programs/UI/AskForSaveFilename.hs
--- a/programs/UI/AskForSaveFilename.hs
+++ b/programs/UI/AskForSaveFilename.hs
@@ -14,22 +14,29 @@
 import Types
 import Theme
 
-drawAskForSaveFilenameUI :: AppState -> [Widget Name]
-drawAskForSaveFilenameUI s = [drawPromptWindow s]
+drawAskForSaveFilenameUI :: Bool -> AppState -> [Widget Name]
+drawAskForSaveFilenameUI isQuitting s = [drawPromptWindow isQuitting s]
 
-drawPromptWindow :: AppState -> Widget Name
-drawPromptWindow s =
+drawPromptWindow :: Bool -> AppState -> Widget Name
+drawPromptWindow isQuitting s =
     centerLayer $
     borderWithLabel (str "Save") $
         hLimit 60 $
         padLeftRight 2 $ padTopBottom 1 body
     where
-        help = hBox [ str "("
-                    , withDefAttr keybindingAttr $ str "Enter"
-                    , str " to save and quit, "
-                    , withDefAttr keybindingAttr $ str "Esc"
-                    , str " to quit without saving)"
-                    ]
+        help = if isQuitting
+                  then hBox [ str "("
+                            , withDefAttr keybindingAttr $ str "Enter"
+                            , str " to save and quit, "
+                            , withDefAttr keybindingAttr $ str "Esc"
+                            , str " to quit without saving)"
+                            ]
+                  else hBox [ str "("
+                            , withDefAttr keybindingAttr $ str "Enter"
+                            , str " to save, "
+                            , withDefAttr keybindingAttr $ str "Esc"
+                            , str " to cancel)"
+                            ]
         body = (hCenter $ str "Save changes to:") <=>
                (hCenter help) <=>
                padTopBottom 1 fn
diff --git a/tart.cabal b/tart.cabal
--- a/tart.cabal
+++ b/tart.cabal
@@ -1,5 +1,5 @@
 name:                tart
-version:             0.1
+version:             0.1.1
 synopsis:            Terminal Art
 description:         A program to make ASCII art
 license:             BSD3
