diff --git a/Network/Wai/Handler/Warp.hs b/Network/Wai/Handler/Warp.hs
--- a/Network/Wai/Handler/Warp.hs
+++ b/Network/Wai/Handler/Warp.hs
@@ -40,6 +40,7 @@
   , setBeforeMainLoop
   , setNoParsePath
   , setInstallShutdownHandler
+  , setServerName
     -- ** Getters
   , getPort
   , getHost
@@ -99,6 +100,7 @@
 import Network.Wai (Request, Response)
 import Network.Socket (SockAddr)
 import Data.Streaming.Network (HostPreference)
+import Data.ByteString (ByteString)
 
 -- | Port to listen on. Default value: 3000
 --
@@ -202,3 +204,9 @@
 -- Since 3.0.1
 setInstallShutdownHandler :: (IO () -> IO ()) -> Settings -> Settings
 setInstallShutdownHandler x y = y { settingsInstallShutdownHandler = x }
+
+-- | Default server name if application does not set one.
+--
+-- Since 3.0.2
+setServerName :: ByteString -> Settings -> Settings
+setServerName x y = y { settingsServerName = x }
diff --git a/Network/Wai/Handler/Warp/Response.hs b/Network/Wai/Handler/Warp/Response.hs
--- a/Network/Wai/Handler/Warp/Response.hs
+++ b/Network/Wai/Handler/Warp/Response.hs
@@ -157,14 +157,15 @@
 --     Typically, Transfer-Encoding: chunked is used.
 --     If Content-Length is specified, Transfer-Encoding: chunked is not used.
 
-sendResponse :: Connection
+sendResponse :: ByteString -- ^ default server value
+             -> Connection
              -> InternalInfo
              -> Request -- ^ HTTP request.
              -> IndexedHeader -- ^ Indexed header of HTTP request.
              -> IO ByteString -- ^ source from client, for raw response
              -> Response -- ^ HTTP response including status code and response header.
              -> IO Bool -- ^ Returing True if the connection is persistent.
-sendResponse conn ii req reqidxhdr src response = do
+sendResponse defServer conn ii req reqidxhdr src response = do
     hs <- addServerAndDate hs0
     if hasBody s req then do
         sendRsp conn ver s hs rsp
@@ -181,7 +182,7 @@
     rspidxhdr = indexResponseHeader hs0
     th = threadHandle ii
     dc = dateCacher ii
-    addServerAndDate = addDate dc rspidxhdr . addServer rspidxhdr
+    addServerAndDate = addDate dc rspidxhdr . addServer defServer rspidxhdr
     mRange = reqidxhdr ! idxRange
     reqinfo@(isPersist,_) = infoFromRequest req reqidxhdr
     (isKeepAlive, needsChunked) = infoFromResponse rspidxhdr reqinfo
@@ -389,9 +390,9 @@
 defaultServerValue :: HeaderValue
 defaultServerValue = B.pack $ "Warp/" ++ warpVersion
 
-addServer :: IndexedHeader -> H.ResponseHeaders -> H.ResponseHeaders
-addServer rspidxhdr hdrs = case rspidxhdr ! idxServer of
-    Nothing -> (hServer, defaultServerValue) : hdrs
+addServer :: HeaderValue -> IndexedHeader -> H.ResponseHeaders -> H.ResponseHeaders
+addServer defaultServerValue' rspidxhdr hdrs = case rspidxhdr ! idxServer of
+    Nothing -> (hServer, defaultServerValue') : hdrs
     _       -> hdrs
 
 ----------------------------------------------------------------
diff --git a/Network/Wai/Handler/Warp/Run.hs b/Network/Wai/Handler/Warp/Run.hs
--- a/Network/Wai/Handler/Warp/Run.hs
+++ b/Network/Wai/Handler/Warp/Run.hs
@@ -284,7 +284,9 @@
     sendErrorResponse istatus e = do
         status <- readIORef istatus
         when status $ void $
-            sendResponse conn ii dummyreq defaultIndexRequestHeader (return S.empty) (errorResponse e)
+            sendResponse
+                (settingsServerName settings)
+                conn ii dummyreq defaultIndexRequestHeader (return S.empty) (errorResponse e)
 
     dummyreq = defaultRequest { remoteHost = addr }
 
@@ -306,7 +308,9 @@
             -- send more meaningful error messages to the user.
             -- However, it may affect performance.
             writeIORef istatus False
-            keepAlive <- sendResponse conn ii req idxhdr (readSource fromClient) res
+            keepAlive <- sendResponse
+                (settingsServerName settings)
+                conn ii req idxhdr (readSource fromClient) res
             writeIORef keepAliveRef keepAlive
             return ResponseReceived
         keepAlive <- readIORef keepAliveRef
diff --git a/Network/Wai/Handler/Warp/Settings.hs b/Network/Wai/Handler/Warp/Settings.hs
--- a/Network/Wai/Handler/Warp/Settings.hs
+++ b/Network/Wai/Handler/Warp/Settings.hs
@@ -18,6 +18,10 @@
 import System.IO.Error (ioeGetErrorType)
 import qualified Data.Text.Lazy as TL
 import qualified Data.Text.Lazy.Encoding as TLE
+import Data.ByteString (ByteString)
+import qualified Data.ByteString.Char8 as S8
+import Data.Version (showVersion)
+import qualified Paths_warp
 
 -- | Various Warp server settings. This is purposely kept as an abstract data
 -- type so that new settings can be added without breaking backwards
@@ -57,6 +61,10 @@
       --
       -- Since 2.0.3
     , settingsInstallShutdownHandler :: IO () -> IO ()
+    , settingsServerName :: ByteString
+      -- ^ Default server name if application does not set one.
+      --
+      -- Since 3.0.2
     }
 
 -- | The default settings for the Warp server. See the individual settings for
@@ -75,6 +83,7 @@
     , settingsBeforeMainLoop = return ()
     , settingsNoParsePath = False
     , settingsInstallShutdownHandler = const $ return ()
+    , settingsServerName = S8.pack $ "Warp/" ++ showVersion Paths_warp.version
     }
 
 -- | Apply the logic provided by 'defaultExceptionHandler' to determine if an
diff --git a/warp.cabal b/warp.cabal
--- a/warp.cabal
+++ b/warp.cabal
@@ -1,5 +1,5 @@
 Name:                warp
-Version:             3.0.1.1
+Version:             3.0.2
 Synopsis:            A fast, light-weight web server for WAI applications.
 License:             MIT
 License-file:        LICENSE
