diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,12 +1,20 @@
+## 0.2.3.0 (2018-04-10)
+
+ * API addition: 'statsdFlush', allows to flush the sample to statsd
+   server manually
+   ([#18](https://github.com/tibbe/ekg-statsd/pull/18)).
+
 ## 0.2.2.0 (2017-09-25)
 
- * Remove internal `diffSample` optimisation and always report the full
-   state of the `Store` instead of only what's changed between iterations.
+ * Remove internal `diffSample` optimisation and always report the
+   full state of the `Store` instead of only what's changed between
+   iterations ([#17](https://github.com/tibbe/ekg-statsd/pull/17)).
 
 ## 0.2.1.1 (2017-07-31)
 
  * Support GHC 8.2.1.
- * Suppress errors when sending to a non-existent receiver (#6).
+ * Suppress errors when sending to a non-existent receiver
+   ([#6](https://github.com/tibbe/ekg-statsd/pull/6)).
 
 ## 0.2.1.0 (2016-08-11)
 
@@ -37,4 +45,3 @@
 ## 0.1.0.0 (2014-05-01)
 
  * Initial release.
-
diff --git a/System/Remote/Monitoring/Statsd.hs b/System/Remote/Monitoring/Statsd.hs
--- a/System/Remote/Monitoring/Statsd.hs
+++ b/System/Remote/Monitoring/Statsd.hs
@@ -17,6 +17,7 @@
     (
       -- * The statsd syncer
       Statsd
+    , statsdFlush
     , statsdThreadId
     , forkStatsd
     , StatsdOptions(..)
@@ -52,6 +53,7 @@
 -- Created by 'forkStatsd'.
 data Statsd = Statsd
     { threadId :: {-# UNPACK #-} !ThreadId
+    , flush    :: IO ()
     }
 
 -- | The thread ID of the statsd sync thread. You can stop the sync by
@@ -60,6 +62,12 @@
 statsdThreadId :: Statsd -> ThreadId
 statsdThreadId = threadId
 
+-- | Flush a sample to the statsd server
+--
+-- @since 0.2.3.0
+statsdFlush :: Statsd -> IO ()
+statsdFlush = flush
+
 -- | Options to control how to connect to the statsd server and how
 -- often to flush metrics. The flush interval should be shorter than
 -- the flush interval statsd itself uses to flush data to its
@@ -131,28 +139,31 @@
 
             return (sendSample, Socket.close socket)
 
+    let flush = do
+          sample <- Metrics.sampleAll store
+          flushSample sample sendSample opts
+
     me <- myThreadId
-    tid <- forkFinally (loop store sendSample opts) $ \ r -> do
+    tid <- forkFinally (loop opts flush) $ \ r -> do
         closeSocket
         case r of
             Left e  -> throwTo me e
             Right _ -> return ()
-    return $ Statsd tid
+
+    return $ Statsd tid flush
   where
     unsupportedAddressError = ioError $ userError $
         "unsupported address: " ++ T.unpack (host opts)
 
-loop :: Metrics.Store            -- ^ Metric store
-     -> (B8.ByteString -> IO ()) -- ^ Action to send a sample
-     -> StatsdOptions            -- ^ Options
+loop :: StatsdOptions -- ^ Options
+     -> IO ()         -- ^ Action to flush the sample
      -> IO ()
-loop store sendSample opts = do
+loop opts flush = do
     start <- time
-    sample <- Metrics.sampleAll store
-    flushSample sample sendSample opts
+    flush
     end <- time
     threadDelay (flushInterval opts * 1000 - fromIntegral (end - start))
-    loop store sendSample opts
+    loop opts flush
 
 -- | Microseconds since epoch.
 time :: IO Int64
diff --git a/ekg-statsd.cabal b/ekg-statsd.cabal
--- a/ekg-statsd.cabal
+++ b/ekg-statsd.cabal
@@ -1,5 +1,5 @@
 name:                ekg-statsd
-version:             0.2.2.0
+version:             0.2.3.0
 synopsis:            Push metrics to statsd
 description:
   This library lets you push system metrics to a statsd server.
@@ -14,14 +14,15 @@
 build-type:          Simple
 extra-source-files:  CHANGES.md
 cabal-version:       >=1.10
-tested-with:         GHC==8.2.1, GHC==8.0.2, GHC == 7.10.3, GHC == 7.8.4, GHC == 7.6.3
+tested-with:         GHC == 8.4.1,  GHC == 8.2.2, GHC == 8.0.2,
+                     GHC == 7.10.3, GHC == 7.8.4, GHC == 7.6.3
 
 library
   exposed-modules:
     System.Remote.Monitoring.Statsd
 
   build-depends:
-    base >= 4.5 && < 4.11,
+    base >= 4.5 && < 4.12,
     bytestring < 1.0,
     ekg-core >= 0.1 && < 1.0,
     network < 2.7,
