diff --git a/examples/cmake_simple/simple.proto b/examples/cmake_simple/simple.proto
index 26e72f46ed5cd963e4b8ef9cc8b02660d826654d..5c73a3b229e12687573f8f15a44f3baa13cf471e 100644
--- a/examples/cmake_simple/simple.proto
+++ b/examples/cmake_simple/simple.proto
@@ -1,6 +1,8 @@
 // A very simple protocol definition, consisting of only
 // one message.
 
+syntax = "proto2";
+
 message SimpleMessage {
     required int32 lucky_number = 1;
 }
diff --git a/examples/network_server/fileproto.proto b/examples/network_server/fileproto.proto
index 3e70c4921733b703616c4257ec3cbb66747b42a6..5640b8d501004892603ec0d0bc88d8c159654c0c 100644
--- a/examples/network_server/fileproto.proto
+++ b/examples/network_server/fileproto.proto
@@ -2,6 +2,8 @@
 //
 // See also the nanopb-specific options in fileproto.options.
 
+syntax = "proto2";
+
 message ListFilesRequest {
     optional string path = 1 [default = "/"];
 }
diff --git a/examples/simple/simple.proto b/examples/simple/simple.proto
index 26e72f46ed5cd963e4b8ef9cc8b02660d826654d..5c73a3b229e12687573f8f15a44f3baa13cf471e 100644
--- a/examples/simple/simple.proto
+++ b/examples/simple/simple.proto
@@ -1,6 +1,8 @@
 // A very simple protocol definition, consisting of only
 // one message.
 
+syntax = "proto2";
+
 message SimpleMessage {
     required int32 lucky_number = 1;
 }
diff --git a/examples/using_double_on_avr/doubleproto.proto b/examples/using_double_on_avr/doubleproto.proto
index d8b7f2db1f6ae9c5c8973df95ccc81e71e29d85d..72d3f9c127fab2afb992c11ddff515f80ce3fc9c 100644
--- a/examples/using_double_on_avr/doubleproto.proto
+++ b/examples/using_double_on_avr/doubleproto.proto
@@ -1,4 +1,6 @@
 // A message containing doubles, as used by other applications.
+syntax = "proto2";
+
 message DoubleMessage {
     required double field1 = 1;
     required double field2 = 2;
diff --git a/examples/using_union_messages/unionproto.proto b/examples/using_union_messages/unionproto.proto
index d7c9de2d3b22f8acf140dca2d2ae9b857bc3fba7..209df0d27a024e7f2f1aeacc4ca36bcdf281284e 100644
--- a/examples/using_union_messages/unionproto.proto
+++ b/examples/using_union_messages/unionproto.proto
@@ -5,6 +5,8 @@
 // but they are commonly implemented by filling out exactly one of
 // several optional fields.
 
+syntax = "proto2";
+
 message MsgType1
 {
     required int32 value = 1;
diff --git a/tests/alltypes/alltypes.proto b/tests/alltypes/alltypes.proto
index 28eaf0beef079efb9343d6d393edc5184f2a0fa1..3995c552972515ab023964035eeea84c640cc816 100644
--- a/tests/alltypes/alltypes.proto
+++ b/tests/alltypes/alltypes.proto
@@ -1,3 +1,6 @@
+syntax = "proto2";
+// package name placeholder
+
 message SubMessage {
     required string substuff1 = 1 [default = "1"];
     required int32 substuff2 = 2 [default = 2];
diff --git a/tests/backwards_compatibility/alltypes_legacy.proto b/tests/backwards_compatibility/alltypes_legacy.proto
index d7631eb6de7189045c160650f7375b31ded9facd..f5bc35ce40af588b4e88a8d550d64068a4ab9d5b 100644
--- a/tests/backwards_compatibility/alltypes_legacy.proto
+++ b/tests/backwards_compatibility/alltypes_legacy.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 message SubMessage {
     required string substuff1 = 1 [default = "1"];
     required int32 substuff2 = 2 [default = 2];
diff --git a/tests/callbacks/callbacks.proto b/tests/callbacks/callbacks.proto
index ccd1edd8c5bcc98666d06ce765e11196d9c96810..96ac744d53d8cc0c590f90c252e9c619dcb2917d 100644
--- a/tests/callbacks/callbacks.proto
+++ b/tests/callbacks/callbacks.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 message SubMessage {
     optional string stringvalue = 1;
     repeated int32 int32value = 2;
diff --git a/tests/common/person.proto b/tests/common/person.proto
index dafcf93455d0a82a5b2467987fefb134db28fc35..becefdf3f2ebf6521a667577db7602f0da8486cb 100644
--- a/tests/common/person.proto
+++ b/tests/common/person.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import "nanopb.proto";
 
 message Person {
diff --git a/tests/common/unittestproto.proto b/tests/common/unittestproto.proto
index 0ecb1f0baa52aec7f5cd6f9a86d6cf594f31f543..23b5b97f87792a4c17dc0eb673341f747996babc 100644
--- a/tests/common/unittestproto.proto
+++ b/tests/common/unittestproto.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import 'nanopb.proto';
 
 message IntegerArray {
diff --git a/tests/cyclic_messages/cyclic.proto b/tests/cyclic_messages/cyclic.proto
index a9d158cb93f2ac0a16e239e7ff5303c5dd323b6d..8cab0b142e3e71514ca7516a45a894135da42ecb 100644
--- a/tests/cyclic_messages/cyclic.proto
+++ b/tests/cyclic_messages/cyclic.proto
@@ -2,6 +2,8 @@
 // These can only be handled in pointer/callback mode,
 // see associated .options files.
 
+syntax = "proto2";
+
 message TreeNode
 {
     optional int32 leaf = 1;
diff --git a/tests/enum_sizes/enumsizes.proto b/tests/enum_sizes/enumsizes.proto
index f9ab0b7f52ed80aef5e5c29f8c2dc077bc16650a..a85d4160135122cbd3c5081eafad81fbbc7643aa 100644
--- a/tests/enum_sizes/enumsizes.proto
+++ b/tests/enum_sizes/enumsizes.proto
@@ -4,6 +4,8 @@
  * a bit of a problem for the encoder/decoder (issue #164).
  */
 
+syntax = "proto2";
+
 import 'nanopb.proto';
 
 option (nanopb_fileopt).long_names = false;
diff --git a/tests/extensions/extensions.proto b/tests/extensions/extensions.proto
index 79c01245e82dfb021c4b196e7e5de63abdd65cbb..fcd5b43bdbdf6730e61cf3c1f1ea6e86c769ab9f 100644
--- a/tests/extensions/extensions.proto
+++ b/tests/extensions/extensions.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import 'alltypes.proto';
 
 extend AllTypes {
diff --git a/tests/field_size_16/alltypes.proto b/tests/field_size_16/alltypes.proto
index 039391fcde42db3661cd3a798cf541def441eede..ba1ec383c9a25bcebb5dde2536738b1faa0e20c5 100644
--- a/tests/field_size_16/alltypes.proto
+++ b/tests/field_size_16/alltypes.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 message SubMessage {
     required string substuff1 = 1 [default = "1"];
     required int32 substuff2 = 2 [default = 2];
diff --git a/tests/field_size_32/alltypes.proto b/tests/field_size_32/alltypes.proto
index 5749e0d482b15b7b2e61fad13ce82cf8d0dd578a..02ee1a6a7fd111eed3c6c6756ca7f10d5d4836a6 100644
--- a/tests/field_size_32/alltypes.proto
+++ b/tests/field_size_32/alltypes.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 message SubMessage {
     required string substuff1 = 1 [default = "1"];
     required int32 substuff2 = 2 [default = 2];
diff --git a/tests/fuzztest/SConscript b/tests/fuzztest/SConscript
index 35b697f962d09c7beb500be1ca2919558b601d50..973148c2aa95e0b15041447e09e1bdcbd84c0edc 100644
--- a/tests/fuzztest/SConscript
+++ b/tests/fuzztest/SConscript
@@ -2,16 +2,19 @@
 
 Import("env", "malloc_env")
 
+def set_pkgname(src, dst, pkgname):
+    data = open(str(src)).read()
+    placeholder = '// package name placeholder'
+    assert placeholder in data
+    data = data.replace(placeholder, 'package %s;' % pkgname)
+    open(str(dst), 'w').write(data)
+
 # We want both pointer and static versions of the AllTypes message
 # Prefix them with package name.
 env.Command("alltypes_static.proto", "#alltypes/alltypes.proto",
-            lambda target, source, env:
-                open(str(target[0]), 'w').write("package alltypes_static;\n"
-                                                + open(str(source[0])).read()))
+            lambda target, source, env: set_pkgname(source[0], target[0], 'alltypes_static'))
 env.Command("alltypes_pointer.proto", "#alltypes/alltypes.proto",
-            lambda target, source, env:
-                open(str(target[0]), 'w').write("package alltypes_pointer;\n"
-                                                + open(str(source[0])).read()))
+            lambda target, source, env: set_pkgname(source[0], target[0], 'alltypes_pointer'))
 
 p1 = env.NanopbProto(["alltypes_pointer", "alltypes_pointer.options"])
 p2 = env.NanopbProto(["alltypes_static", "alltypes_static.options"])
diff --git a/tests/intsizes/intsizes.proto b/tests/intsizes/intsizes.proto
index 236bf1832957a9f1f201b43d369f3c234e989db2..91444d41d682e475fff490b69a53e01c8f04c850 100644
--- a/tests/intsizes/intsizes.proto
+++ b/tests/intsizes/intsizes.proto
@@ -6,6 +6,8 @@
  * otherwise. E.g. uint32 + IS_8 => uint8_t
  */
 
+syntax = "proto2";
+
 import 'nanopb.proto';
 
 message IntSizes {
diff --git a/tests/message_sizes/messages1.proto b/tests/message_sizes/messages1.proto
index 48af55a347cfc9f32001c4f74e2282351b54970a..b66fad71f4cf4fac4e7f4bf897654a0da4a6b9e5 100644
--- a/tests/message_sizes/messages1.proto
+++ b/tests/message_sizes/messages1.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 enum MessageStatus {
     FAIL = 0;
     OK = 1;
diff --git a/tests/message_sizes/messages2.proto b/tests/message_sizes/messages2.proto
index 19fc11ef4708fc8a19b129c14c747a9b6327b0e0..6761408073e7402498e70a0f139848a421859ad6 100644
--- a/tests/message_sizes/messages2.proto
+++ b/tests/message_sizes/messages2.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import 'nanopb.proto';
 import 'messages1.proto';
 
diff --git a/tests/missing_fields/missing_fields.proto b/tests/missing_fields/missing_fields.proto
index cbb23ba16d28e301b45497ac2abddc9e3eb228dc..cc5e550b158e6e5b3de2fc97d9bfb61d839b8019 100644
--- a/tests/missing_fields/missing_fields.proto
+++ b/tests/missing_fields/missing_fields.proto
@@ -1,5 +1,7 @@
 /* Test for one missing field among many */
 
+syntax = "proto2";
+
 message AllFields
 {
     required int32 field1 = 1;
diff --git a/tests/multiple_files/multifile1.proto b/tests/multiple_files/multifile1.proto
index d804b67dac4476e52d38927d392c575b8922b94d..18f2c672ce0b2b7811becb14088db85439f9296f 100644
--- a/tests/multiple_files/multifile1.proto
+++ b/tests/multiple_files/multifile1.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 message SubMessage {
     optional string stringvalue = 1;
     repeated int32 int32value = 2;
diff --git a/tests/multiple_files/multifile2.proto b/tests/multiple_files/multifile2.proto
index 66cb8a0b6b06484c30ba8f04c8dad1bc60b77385..4af45fd9acf9edbae34afde361b3bd618650c6b1 100644
--- a/tests/multiple_files/multifile2.proto
+++ b/tests/multiple_files/multifile2.proto
@@ -1,5 +1,7 @@
 // Test if including generated header file for this file + implicit include of
 // multifile2.pb.h still compiles. Used with test_compiles.c.
+syntax = "proto2";
+
 import "multifile1.proto";
 
 message Callback2Message {
diff --git a/tests/no_messages/no_messages.proto b/tests/no_messages/no_messages.proto
index 279216b0b4eed96438191e89d151b9f4d088dba2..45bb2e6660d5552e9881cc080545c9df900a7e02 100644
--- a/tests/no_messages/no_messages.proto
+++ b/tests/no_messages/no_messages.proto
@@ -1,5 +1,7 @@
 /* Test that a file without any messages works. */
 
+syntax = "proto2";
+
 enum Test {
     First = 1;
 }
diff --git a/tests/oneof/oneof.proto b/tests/oneof/oneof.proto
index 00f1cecaf05f28cb5e1f4e5903da51ede9e74204..b4fe56f2b6447cf82ff82115955afcfe9745ff55 100644
--- a/tests/oneof/oneof.proto
+++ b/tests/oneof/oneof.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import 'nanopb.proto';
 
 message SubMessage
diff --git a/tests/options/options.proto b/tests/options/options.proto
index b70504185bca2b294c553d18245c85474ccc1e0e..aa722b526d62911d726b45124cac712d7e6912af 100644
--- a/tests/options/options.proto
+++ b/tests/options/options.proto
@@ -2,6 +2,8 @@
  * options.expected lists the patterns that are searched for in the output.
  */
 
+syntax = "proto2";
+
 import "nanopb.proto";
 
 // File level options
diff --git a/tests/package_name/SConscript b/tests/package_name/SConscript
index 897bc99cafc4c89310b1f2ef76d2cbc647ef3531..4afc5037378f8b3d968d065c779e175b2886e32e 100644
--- a/tests/package_name/SConscript
+++ b/tests/package_name/SConscript
@@ -3,14 +3,16 @@
 
 Import("env")
 
-# Build a modified alltypes.proto
-def modify_proto(target, source, env):
-    '''Add a "package test.package;" directive to the beginning of the .proto file.'''
-    data = open(str(source[0]), 'r').read()
-    open(str(target[0]), 'w').write("package test.package;\n\n" + data)
-    return 0
+def set_pkgname(src, dst, pkgname):
+    data = open(str(src)).read()
+    placeholder = '// package name placeholder'
+    assert placeholder in data
+    data = data.replace(placeholder, 'package %s;' % pkgname)
+    open(str(dst), 'w').write(data)
 
-env.Command("alltypes.proto", "#alltypes/alltypes.proto", modify_proto)
+# Build a modified alltypes.proto
+env.Command("alltypes.proto", "#alltypes/alltypes.proto",
+            lambda target, source, env: set_pkgname(source[0], target[0], 'test.package'))
 env.Command("alltypes.options", "#alltypes/alltypes.options", Copy("$TARGET", "$SOURCE"))
 env.NanopbProto(["alltypes", "alltypes.options"])
 
diff --git a/tests/regression/issue_118/enumdef.proto b/tests/regression/issue_118/enumdef.proto
index 830d2988ce49f71c3f7cbb66de518f52899360f9..46845bc9e26a2ad4194566f65a9c45ff9a56fa25 100644
--- a/tests/regression/issue_118/enumdef.proto
+++ b/tests/regression/issue_118/enumdef.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import 'nanopb.proto';
 
 enum MyEnum {
diff --git a/tests/regression/issue_118/enumuse.proto b/tests/regression/issue_118/enumuse.proto
index d778fb8f319c935bf366f995e60562fe7e29c40d..4afc45211ceeaa01fc4061d93fb602a19aab2ecb 100644
--- a/tests/regression/issue_118/enumuse.proto
+++ b/tests/regression/issue_118/enumuse.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import 'enumdef.proto';
 
 message MyMessage {
diff --git a/tests/regression/issue_125/extensionbug.proto b/tests/regression/issue_125/extensionbug.proto
index c4ac6860df615ad536605d20407023d079bbb58c..fd1e74f105c449df7dcd6f13355e5d338e77b2e2 100644
--- a/tests/regression/issue_125/extensionbug.proto
+++ b/tests/regression/issue_125/extensionbug.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 message Message1
 {
 	optional uint32	fieldA = 1;
diff --git a/tests/regression/issue_141/testproto.proto b/tests/regression/issue_141/testproto.proto
index 21598b45b2d0bfcc1a1bf1bc50c48ebadc9a972d..a445c68a2a02502a3fdf9e697622acf56ff70ac4 100644
--- a/tests/regression/issue_141/testproto.proto
+++ b/tests/regression/issue_141/testproto.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 import 'nanopb.proto';
 
 message SubMessage
diff --git a/tests/regression/issue_145/comments.proto b/tests/regression/issue_145/comments.proto
index 4e86b3028876abda8fd6dfa1eae67632bd04406c..621779f54ce45763928fdbefd1241834f4461c1c 100644
--- a/tests/regression/issue_145/comments.proto
+++ b/tests/regression/issue_145/comments.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 message DummyMessage {
     required string foo = 1;
     required string bar = 2;
diff --git a/tests/regression/issue_166/enums.proto b/tests/regression/issue_166/enums.proto
index a0964ab46aecb730f80fcb83461200b1f9c549c5..36948044bf9d3539e29df8356d0b976acd4d4ac3 100644
--- a/tests/regression/issue_166/enums.proto
+++ b/tests/regression/issue_166/enums.proto
@@ -1,3 +1,5 @@
+syntax = "proto2";
+
 enum SignedEnum {
     SE_MIN = -1;
     SE_MAX = 255;
diff --git a/tests/special_characters/funny-proto+name has.characters.proto b/tests/special_characters/funny-proto+name has.characters.proto
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..26b2cb1b0af105e0947114e6d02669f003dc08b5 100644
--- a/tests/special_characters/funny-proto+name has.characters.proto	
+++ b/tests/special_characters/funny-proto+name has.characters.proto	
@@ -0,0 +1 @@
+syntax="proto2";