diff --git a/postgresql-simple.cabal b/postgresql-simple.cabal
--- a/postgresql-simple.cabal
+++ b/postgresql-simple.cabal
@@ -1,5 +1,5 @@
 Name:                postgresql-simple
-Version:             0.4.4.0
+Version:             0.4.4.1
 Synopsis:            Mid-Level PostgreSQL client library
 Description:
     Mid-Level PostgreSQL client library, forked from mysql-simple.
@@ -81,7 +81,7 @@
 source-repository this
   type:     git
   location: http://github.com/lpsmith/postgresql-simple
-  tag:      v0.4.4.0
+  tag:      v0.4.4.1
 
 test-suite test
   type:           exitcode-stdio-1.0
diff --git a/src/Database/PostgreSQL/Simple/Copy.hs b/src/Database/PostgreSQL/Simple/Copy.hs
--- a/src/Database/PostgreSQL/Simple/Copy.hs
+++ b/src/Database/PostgreSQL/Simple/Copy.hs
@@ -186,6 +186,7 @@
 putCopyError :: Connection -> B.ByteString -> IO ()
 putCopyError conn err = withConnection conn $ \pqconn -> do
     doCopyIn funcName (\c -> PQ.putCopyEnd c (Just err)) pqconn
+    consumeResults pqconn
   where
     funcName = "Database.PostgreSQL.Simple.Copy.putCopyError"
 
@@ -220,6 +221,7 @@
 getCopyCommandTag funcName pqconn = do
     result  <- maybe (fail errCmdStatus) return =<< PQ.getResult pqconn
     cmdStat <- maybe (fail errCmdStatus) return =<< PQ.cmdStatus result
+    consumeResults pqconn
     let rowCount =   P.string "COPY " *> (P.decimal <* P.endOfInput)
     case P.parseOnly rowCount cmdStat of
       Left  _ -> fail errCmdStatusFmt
@@ -227,3 +229,11 @@
   where
     errCmdStatus    = B.unpack funcName ++ ": failed to fetch command status"
     errCmdStatusFmt = B.unpack funcName ++ ": failed to parse command status"
+
+
+consumeResults :: PQ.Connection -> IO ()
+consumeResults pqconn = do
+    mres <- PQ.getResult pqconn
+    case mres of
+      Nothing -> return ()
+      Just _  -> consumeResults pqconn
diff --git a/src/Database/PostgreSQL/Simple/Internal.hs b/src/Database/PostgreSQL/Simple/Internal.hs
--- a/src/Database/PostgreSQL/Simple/Internal.hs
+++ b/src/Database/PostgreSQL/Simple/Internal.hs
@@ -311,7 +311,17 @@
             Nothing -> case mres of
                          Nothing  -> throwLibPQError h "PQgetResult returned no results"
                          Just res -> return res
-            Just _  -> getResult h mres'
+            Just res -> do
+                status <- PQ.resultStatus res
+                case status of
+                   PQ.EmptyQuery    -> getResult h mres'
+                   PQ.CommandOk     -> getResult h mres'
+                   PQ.TuplesOk      -> getResult h mres'
+                   PQ.CopyOut       -> return res
+                   PQ.CopyIn        -> return res
+                   PQ.BadResponse   -> getResult h mres'
+                   PQ.NonfatalError -> getResult h mres'
+                   PQ.FatalError    -> getResult h mres'
 #endif
 
 -- | A version of 'execute' that does not perform query substitution.
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -5,6 +5,7 @@
 import Database.PostgreSQL.Simple.FromField (FromField)
 import Database.PostgreSQL.Simple.Types(Query(..),Values(..))
 import Database.PostgreSQL.Simple.HStore
+import Database.PostgreSQL.Simple.Copy
 import qualified Database.PostgreSQL.Simple.Transaction as ST
 import Control.Applicative
 import Control.Exception as E
@@ -41,6 +42,7 @@
     , TestLabel "Savepoint"     . testSavepoint
     , TestLabel "Unicode"       . testUnicode
     , TestLabel "Values"        . testValues
+    , TestLabel "Copy"          . testCopy
     ]
 
 testBytea :: TestEnv -> Test
@@ -274,6 +276,35 @@
       execute conn "INSERT INTO values_test ?" (Only table)
       vals' <- query_  conn "DELETE FROM values_test RETURNING *"
       sort vals @?= sort vals'
+
+
+testCopy :: TestEnv -> Test
+testCopy TestEnv{..} = TestCase $ do
+    execute_ conn "CREATE TEMPORARY TABLE copy_test (x int, y text)"
+    copy_ conn "COPY copy_test FROM STDIN (FORMAT CSV)"
+    mapM_ (putCopyData conn) copyRows
+    putCopyEnd conn
+    copy_ conn "COPY copy_test FROM STDIN (FORMAT CSV)"
+    mapM_ (putCopyData conn) abortRows
+    putCopyError conn "aborted"
+    -- Hmm, does postgres always produce \n as an end-of-line here, or
+    -- are there cases where it will use a \r\n as well?
+    copy_ conn "COPY copy_test TO STDOUT (FORMAT CSV)"
+    rows <- loop []
+    sort rows @?= sort copyRows
+    -- Now, let's just verify that the connection state is back to ready,
+    -- so that we can issue more queries:
+    [Only (x::Int)] <- query_ conn "SELECT 2 + 2"
+    x @?= 4
+  where
+    copyRows  = ["1,foo\n"
+                ,"2,bar\n"]
+    abortRows = ["3,baz\n"]
+    loop rows = do
+      mrow <- getCopyData conn
+      case mrow of
+        CopyOutDone _   -> return rows
+        CopyOutRow  row -> loop (row:rows)
 
 data TestException
   = TestException
