diff --git a/Text/ProtocolBuffers/ProtoCompile/Gen.hs b/Text/ProtocolBuffers/ProtoCompile/Gen.hs
--- a/Text/ProtocolBuffers/ProtoCompile/Gen.hs
+++ b/Text/ProtocolBuffers/ProtoCompile/Gen.hs
@@ -641,16 +641,22 @@
 instanceTextMsg :: DescriptorInfo -> Decl
 instanceTextMsg di 
   = InstDecl src Nothing [] [] (private "TextMsg") [TyCon (unqualName (descName di))] [
-        inst "textPut" [patvar "msg"] (Do $ map printField flds)
+        inst "textPut" [patvar msgVar] genPrintFields
       , InsDecl $ FunBind [Match src (Ident "textGet") [] Nothing (UnGuardedRhs parser) (BDecls subparsers)]
       ]
   where flds = F.toList (fields di)
+        msgVar = distinctVar "msg"
+        distinctVar var = if var `elem` reservedVars then distinctVar (var ++ "'") else var
+        reservedVars = map toPrintName flds
+        toPrintName fi = let IName uname = last $ splitFI $ protobufName' (fieldName fi) in uToString uname
         printField fi = let Ident funcname = baseIdent' (fieldName fi)
-                            IName uname = last $ splitFI $ protobufName' (fieldName fi)
-                            printname = uToString uname
-                         in Qualifier $ pvar "tellT" $$ litStr printname $$ Paren (lvar funcname $$ lvar "msg")
+                            printname = toPrintName fi
+                         in Qualifier $ pvar "tellT" $$ litStr printname $$ Paren (lvar funcname $$ lvar msgVar)
+        genPrintFields = if null flds
+                           then preludevar "return" $$ Hse.Tuple Boxed []
+                           else Do $ map printField flds
         parser
-            | Seq.null (fields di) = pvar "return" $$ pvar "defaultValue"
+            | Seq.null (fields di) = preludevar "return" $$ pvar "defaultValue"
             | otherwise = Do [
                 Generator src (patvar "mods") 
                     $ pvar "sepEndBy" 
@@ -664,8 +670,7 @@
              ]
         parserName f = let Ident fname = baseIdent' (fieldName f) in "parse'" ++ fname
         subparsers = map (\f -> defun (parserName f) [] (getField f)) flds
-        getField fi = let IName uname = last $ splitFI $ protobufName' (fieldName fi)
-                          printname = uToString uname
+        getField fi = let printname = toPrintName fi
                           Ident funcname = baseIdent' (fieldName fi)
                           update = if canRepeat fi then pvar "append" $$ Paren (lvar funcname $$ lvar "o") $$ lvar "v" else lvar "v"
             in pvar "try" $$ Do [
diff --git a/hprotoc.cabal b/hprotoc.cabal
--- a/hprotoc.cabal
+++ b/hprotoc.cabal
@@ -1,5 +1,5 @@
 name:           hprotoc
-version:        2.1.3
+version:        2.1.4
 cabal-version:  >= 1.6
 build-type:     Simple
 license:        BSD3
@@ -20,8 +20,8 @@
   location: git://github.com/k-bx/protocol-buffers.git
 
 Executable hprotoc
-  build-depends:   protocol-buffers == 2.1.3,
-                   protocol-buffers-descriptor == 2.1.3
+  build-depends:   protocol-buffers == 2.1.4,
+                   protocol-buffers-descriptor == 2.1.4
   Main-Is:         Text/ProtocolBuffers/ProtoCompile.hs
   Hs-Source-Dirs:  .,
                    protoc-gen-haskell
@@ -69,8 +69,8 @@
                    TypeSynonymInstances
 
 Library
-  build-depends:   protocol-buffers == 2.1.3,
-                   protocol-buffers-descriptor == 2.1.3
+  build-depends:   protocol-buffers == 2.1.4,
+                   protocol-buffers-descriptor == 2.1.4
   Hs-Source-Dirs:  .,
                    protoc-gen-haskell
   build-tools:     alex
