diff --git a/tests/monster_test_generated.js b/tests/monster_test_generated.js
index 2a68288..a2abec7 100644
--- a/tests/monster_test_generated.js
+++ b/tests/monster_test_generated.js
@@ -50,18 +50,38 @@
  * @enum {string}
  */
 MyGame.Example.ColorName = {
-  1: 'Red',
+  '1': 'Red',
 
   /**
    * \brief color Green
    * Green is bit_flag with value (1u << 1)
    */
-  2: 'Green',
+  '2': 'Green',
 
   /**
    * \brief color Blue (1u << 3)
    */
-  8: 'Blue'
+  '8': 'Blue'
+};
+
+/**
+ * @enum {number}
+ */
+MyGame.Example.Race = {
+  None: -1,
+  Human: 0,
+  Dwarf: 1,
+  Elf: 2
+};
+
+/**
+ * @enum {string}
+ */
+MyGame.Example.RaceName = {
+  '-1': 'None',
+  '0': 'Human',
+  '1': 'Dwarf',
+  '2': 'Elf'
 };
 
 /**
@@ -78,10 +98,10 @@
  * @enum {string}
  */
 MyGame.Example.AnyName = {
-  0: 'NONE',
-  1: 'Monster',
-  2: 'TestSimpleTableWithEnum',
-  3: 'MyGame_Example2_Monster'
+  '0': 'NONE',
+  '1': 'Monster',
+  '2': 'TestSimpleTableWithEnum',
+  '3': 'MyGame_Example2_Monster'
 };
 
 /**
@@ -98,10 +118,10 @@
  * @enum {string}
  */
 MyGame.Example.AnyUniqueAliasesName = {
-  0: 'NONE',
-  1: 'M',
-  2: 'TS',
-  3: 'M2'
+  '0': 'NONE',
+  '1': 'M',
+  '2': 'TS',
+  '3': 'M2'
 };
 
 /**
@@ -118,10 +138,10 @@
  * @enum {string}
  */
 MyGame.Example.AnyAmbiguousAliasesName = {
-  0: 'NONE',
-  1: 'M1',
-  2: 'M2',
-  3: 'M3'
+  '0': 'NONE',
+  '1': 'M1',
+  '2': 'M2',
+  '3': 'M3'
 };
 
 /**
@@ -165,6 +185,7 @@
  * @returns {MyGame.InParentNamespace}
  */
 MyGame.InParentNamespace.getSizePrefixedRootAsInParentNamespace = function(bb, obj) {
+  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
   return (obj || new MyGame.InParentNamespace).__init(bb.readInt32(bb.position()) + bb.position(), bb);
 };
 
@@ -234,6 +255,7 @@
  * @returns {MyGame.Example2.Monster}
  */
 MyGame.Example2.Monster.getSizePrefixedRootAsMonster = function(bb, obj) {
+  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
   return (obj || new MyGame.Example2.Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
 };
 
@@ -300,13 +322,7 @@
  * @returns {boolean}
  */
 MyGame.Example.Test.prototype.mutate_a = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 0);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeInt16(this.bb_pos + offset, value);
+  this.bb.writeInt16(this.bb_pos + 0, value);
   return true;
 };
 
@@ -322,17 +338,18 @@
  * @returns {boolean}
  */
 MyGame.Example.Test.prototype.mutate_b = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 2);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeInt8(this.bb_pos + offset, value);
+  this.bb.writeInt8(this.bb_pos + 2, value);
   return true;
 };
 
 /**
+ * @returns {number}
+ */
+MyGame.Example.Test.sizeOf = function() {
+  return 4;
+}
+
+/**
  * @param {flatbuffers.Builder} builder
  * @param {number} a
  * @param {number} b
@@ -387,6 +404,7 @@
  * @returns {MyGame.Example.TestSimpleTableWithEnum}
  */
 MyGame.Example.TestSimpleTableWithEnum.getSizePrefixedRootAsTestSimpleTableWithEnum = function(bb, obj) {
+  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
   return (obj || new MyGame.Example.TestSimpleTableWithEnum).__init(bb.readInt32(bb.position()) + bb.position(), bb);
 };
 
@@ -486,13 +504,7 @@
  * @returns {boolean}
  */
 MyGame.Example.Vec3.prototype.mutate_x = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 0);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeFloat32(this.bb_pos + offset, value);
+  this.bb.writeFloat32(this.bb_pos + 0, value);
   return true;
 };
 
@@ -508,13 +520,7 @@
  * @returns {boolean}
  */
 MyGame.Example.Vec3.prototype.mutate_y = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 4);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeFloat32(this.bb_pos + offset, value);
+  this.bb.writeFloat32(this.bb_pos + 4, value);
   return true;
 };
 
@@ -530,13 +536,7 @@
  * @returns {boolean}
  */
 MyGame.Example.Vec3.prototype.mutate_z = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 8);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeFloat32(this.bb_pos + offset, value);
+  this.bb.writeFloat32(this.bb_pos + 8, value);
   return true;
 };
 
@@ -552,13 +552,7 @@
  * @returns {boolean}
  */
 MyGame.Example.Vec3.prototype.mutate_test1 = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 16);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeFloat64(this.bb_pos + offset, value);
+  this.bb.writeFloat64(this.bb_pos + 16, value);
   return true;
 };
 
@@ -574,13 +568,7 @@
  * @returns {boolean}
  */
 MyGame.Example.Vec3.prototype.mutate_test2 = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 24);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeUint8(this.bb_pos + offset, value);
+  this.bb.writeUint8(this.bb_pos + 24, value);
   return true;
 };
 
@@ -593,6 +581,13 @@
 };
 
 /**
+ * @returns {number}
+ */
+MyGame.Example.Vec3.sizeOf = function() {
+  return 32;
+}
+
+/**
  * @param {flatbuffers.Builder} builder
  * @param {number} x
  * @param {number} y
@@ -658,13 +653,7 @@
  * @returns {boolean}
  */
 MyGame.Example.Ability.prototype.mutate_id = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 0);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeUint32(this.bb_pos + offset, value);
+  this.bb.writeUint32(this.bb_pos + 0, value);
   return true;
 };
 
@@ -680,17 +669,18 @@
  * @returns {boolean}
  */
 MyGame.Example.Ability.prototype.mutate_distance = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 4);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeUint32(this.bb_pos + offset, value);
+  this.bb.writeUint32(this.bb_pos + 4, value);
   return true;
 };
 
 /**
+ * @returns {number}
+ */
+MyGame.Example.Ability.sizeOf = function() {
+  return 8;
+}
+
+/**
  * @param {flatbuffers.Builder} builder
  * @param {number} id
  * @param {number} distance
@@ -744,6 +734,7 @@
  * @returns {MyGame.Example.Stat}
  */
 MyGame.Example.Stat.getSizePrefixedRootAsStat = function(bb, obj) {
+  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
   return (obj || new MyGame.Example.Stat).__init(bb.readInt32(bb.position()) + bb.position(), bb);
 };
 
@@ -898,6 +889,7 @@
  * @returns {MyGame.Example.Referrable}
  */
 MyGame.Example.Referrable.getSizePrefixedRootAsReferrable = function(bb, obj) {
+  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
   return (obj || new MyGame.Example.Referrable).__init(bb.readInt32(bb.position()) + bb.position(), bb);
 };
 
@@ -960,7 +952,7 @@
 }
 
 /**
- * an example documentation comment: monster object
+ * an example documentation comment: "monster object"
  *
  * @constructor
  */
@@ -1002,6 +994,7 @@
  * @returns {MyGame.Example.Monster}
  */
 MyGame.Example.Monster.getSizePrefixedRootAsMonster = function(bb, obj) {
+  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
   return (obj || new MyGame.Example.Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
 };
 
@@ -1134,21 +1127,6 @@
 };
 
 /**
- * @param {MyGame.Example.Any} value
- * @returns {boolean}
- */
-MyGame.Example.Monster.prototype.mutate_test_type = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 18);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeUint8(this.bb_pos + offset, value);
-  return true;
-};
-
-/**
  * @param {flatbuffers.Table} obj
  * @returns {?flatbuffers.Table}
  */
@@ -1853,21 +1831,6 @@
 };
 
 /**
- * @param {MyGame.Example.AnyUniqueAliases} value
- * @returns {boolean}
- */
-MyGame.Example.Monster.prototype.mutate_any_unique_type = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 90);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeUint8(this.bb_pos + offset, value);
-  return true;
-};
-
-/**
  * @param {flatbuffers.Table} obj
  * @returns {?flatbuffers.Table}
  */
@@ -1885,21 +1848,6 @@
 };
 
 /**
- * @param {MyGame.Example.AnyAmbiguousAliases} value
- * @returns {boolean}
- */
-MyGame.Example.Monster.prototype.mutate_any_ambiguous_type = function(value) {
-  var offset = this.bb.__offset(this.bb_pos, 94);
-
-  if (offset === 0) {
-    return false;
-  }
-
-  this.bb.writeUint8(this.bb_pos + offset, value);
-  return true;
-};
-
-/**
  * @param {flatbuffers.Table} obj
  * @returns {?flatbuffers.Table}
  */
@@ -1934,10 +1882,58 @@
 };
 
 /**
+ * @returns {MyGame.Example.Race}
+ */
+MyGame.Example.Monster.prototype.signedEnum = function() {
+  var offset = this.bb.__offset(this.bb_pos, 100);
+  return offset ? /** @type {MyGame.Example.Race} */ (this.bb.readInt8(this.bb_pos + offset)) : MyGame.Example.Race.None;
+};
+
+/**
+ * @param {MyGame.Example.Race} value
+ * @returns {boolean}
+ */
+MyGame.Example.Monster.prototype.mutate_signed_enum = function(value) {
+  var offset = this.bb.__offset(this.bb_pos, 100);
+
+  if (offset === 0) {
+    return false;
+  }
+
+  this.bb.writeInt8(this.bb_pos + offset, value);
+  return true;
+};
+
+/**
+ * @param {number} index
+ * @returns {number}
+ */
+MyGame.Example.Monster.prototype.testrequirednestedflatbuffer = function(index) {
+  var offset = this.bb.__offset(this.bb_pos, 102);
+  return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;
+};
+
+/**
+ * @returns {number}
+ */
+MyGame.Example.Monster.prototype.testrequirednestedflatbufferLength = function() {
+  var offset = this.bb.__offset(this.bb_pos, 102);
+  return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {Uint8Array}
+ */
+MyGame.Example.Monster.prototype.testrequirednestedflatbufferArray = function() {
+  var offset = this.bb.__offset(this.bb_pos, 102);
+  return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;
+};
+
+/**
  * @param {flatbuffers.Builder} builder
  */
 MyGame.Example.Monster.startMonster = function(builder) {
-  builder.startObject(48);
+  builder.startObject(50);
 };
 
 /**
@@ -2657,6 +2653,43 @@
 
 /**
  * @param {flatbuffers.Builder} builder
+ * @param {MyGame.Example.Race} signedEnum
+ */
+MyGame.Example.Monster.addSignedEnum = function(builder, signedEnum) {
+  builder.addFieldInt8(48, signedEnum, MyGame.Example.Race.None);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Offset} testrequirednestedflatbufferOffset
+ */
+MyGame.Example.Monster.addTestrequirednestedflatbuffer = function(builder, testrequirednestedflatbufferOffset) {
+  builder.addFieldOffset(49, testrequirednestedflatbufferOffset, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {Array.<number>} data
+ * @returns {flatbuffers.Offset}
+ */
+MyGame.Example.Monster.createTestrequirednestedflatbufferVector = function(builder, data) {
+  builder.startVector(1, data.length, 1);
+  for (var i = data.length - 1; i >= 0; i--) {
+    builder.addInt8(data[i]);
+  }
+  return builder.endVector();
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} numElems
+ */
+MyGame.Example.Monster.startTestrequirednestedflatbufferVector = function(builder, numElems) {
+  builder.startVector(1, numElems, 1);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
  * @returns {flatbuffers.Offset}
  */
 MyGame.Example.Monster.endMonster = function(builder) {
@@ -2682,109 +2715,6 @@
 };
 
 /**
- * @param {flatbuffers.Builder} builder
- * @param {flatbuffers.Offset} posOffset
- * @param {number} mana
- * @param {number} hp
- * @param {flatbuffers.Offset} nameOffset
- * @param {flatbuffers.Offset} inventoryOffset
- * @param {MyGame.Example.Color} color
- * @param {MyGame.Example.Any} testType
- * @param {flatbuffers.Offset} testOffset
- * @param {flatbuffers.Offset} test4Offset
- * @param {flatbuffers.Offset} testarrayofstringOffset
- * @param {flatbuffers.Offset} testarrayoftablesOffset
- * @param {flatbuffers.Offset} enemyOffset
- * @param {flatbuffers.Offset} testnestedflatbufferOffset
- * @param {flatbuffers.Offset} testemptyOffset
- * @param {boolean} testbool
- * @param {number} testhashs32Fnv1
- * @param {number} testhashu32Fnv1
- * @param {flatbuffers.Long} testhashs64Fnv1
- * @param {flatbuffers.Long} testhashu64Fnv1
- * @param {number} testhashs32Fnv1a
- * @param {number} testhashu32Fnv1a
- * @param {flatbuffers.Long} testhashs64Fnv1a
- * @param {flatbuffers.Long} testhashu64Fnv1a
- * @param {flatbuffers.Offset} testarrayofboolsOffset
- * @param {number} testf
- * @param {number} testf2
- * @param {number} testf3
- * @param {flatbuffers.Offset} testarrayofstring2Offset
- * @param {flatbuffers.Offset} testarrayofsortedstructOffset
- * @param {flatbuffers.Offset} flexOffset
- * @param {flatbuffers.Offset} test5Offset
- * @param {flatbuffers.Offset} vectorOfLongsOffset
- * @param {flatbuffers.Offset} vectorOfDoublesOffset
- * @param {flatbuffers.Offset} parentNamespaceTestOffset
- * @param {flatbuffers.Offset} vectorOfReferrablesOffset
- * @param {flatbuffers.Long} singleWeakReference
- * @param {flatbuffers.Offset} vectorOfWeakReferencesOffset
- * @param {flatbuffers.Offset} vectorOfStrongReferrablesOffset
- * @param {flatbuffers.Long} coOwningReference
- * @param {flatbuffers.Offset} vectorOfCoOwningReferencesOffset
- * @param {flatbuffers.Long} nonOwningReference
- * @param {flatbuffers.Offset} vectorOfNonOwningReferencesOffset
- * @param {MyGame.Example.AnyUniqueAliases} anyUniqueType
- * @param {flatbuffers.Offset} anyUniqueOffset
- * @param {MyGame.Example.AnyAmbiguousAliases} anyAmbiguousType
- * @param {flatbuffers.Offset} anyAmbiguousOffset
- * @param {flatbuffers.Offset} vectorOfEnumsOffset
- * @returns {flatbuffers.Offset}
- */
-MyGame.Example.Monster.createMonster = function(builder, posOffset, mana, hp, nameOffset, inventoryOffset, color, testType, testOffset, test4Offset, testarrayofstringOffset, testarrayoftablesOffset, enemyOffset, testnestedflatbufferOffset, testemptyOffset, testbool, testhashs32Fnv1, testhashu32Fnv1, testhashs64Fnv1, testhashu64Fnv1, testhashs32Fnv1a, testhashu32Fnv1a, testhashs64Fnv1a, testhashu64Fnv1a, testarrayofboolsOffset, testf, testf2, testf3, testarrayofstring2Offset, testarrayofsortedstructOffset, flexOffset, test5Offset, vectorOfLongsOffset, vectorOfDoublesOffset, parentNamespaceTestOffset, vectorOfReferrablesOffset, singleWeakReference, vectorOfWeakReferencesOffset, vectorOfStrongReferrablesOffset, coOwningReference, vectorOfCoOwningReferencesOffset, nonOwningReference, vectorOfNonOwningReferencesOffset, anyUniqueType, anyUniqueOffset, anyAmbiguousType, anyAmbiguousOffset, vectorOfEnumsOffset) {
-  MyGame.Example.Monster.startMonster(builder);
-  MyGame.Example.Monster.addPos(builder, posOffset);
-  MyGame.Example.Monster.addMana(builder, mana);
-  MyGame.Example.Monster.addHp(builder, hp);
-  MyGame.Example.Monster.addName(builder, nameOffset);
-  MyGame.Example.Monster.addInventory(builder, inventoryOffset);
-  MyGame.Example.Monster.addColor(builder, color);
-  MyGame.Example.Monster.addTestType(builder, testType);
-  MyGame.Example.Monster.addTest(builder, testOffset);
-  MyGame.Example.Monster.addTest4(builder, test4Offset);
-  MyGame.Example.Monster.addTestarrayofstring(builder, testarrayofstringOffset);
-  MyGame.Example.Monster.addTestarrayoftables(builder, testarrayoftablesOffset);
-  MyGame.Example.Monster.addEnemy(builder, enemyOffset);
-  MyGame.Example.Monster.addTestnestedflatbuffer(builder, testnestedflatbufferOffset);
-  MyGame.Example.Monster.addTestempty(builder, testemptyOffset);
-  MyGame.Example.Monster.addTestbool(builder, testbool);
-  MyGame.Example.Monster.addTesthashs32Fnv1(builder, testhashs32Fnv1);
-  MyGame.Example.Monster.addTesthashu32Fnv1(builder, testhashu32Fnv1);
-  MyGame.Example.Monster.addTesthashs64Fnv1(builder, testhashs64Fnv1);
-  MyGame.Example.Monster.addTesthashu64Fnv1(builder, testhashu64Fnv1);
-  MyGame.Example.Monster.addTesthashs32Fnv1a(builder, testhashs32Fnv1a);
-  MyGame.Example.Monster.addTesthashu32Fnv1a(builder, testhashu32Fnv1a);
-  MyGame.Example.Monster.addTesthashs64Fnv1a(builder, testhashs64Fnv1a);
-  MyGame.Example.Monster.addTesthashu64Fnv1a(builder, testhashu64Fnv1a);
-  MyGame.Example.Monster.addTestarrayofbools(builder, testarrayofboolsOffset);
-  MyGame.Example.Monster.addTestf(builder, testf);
-  MyGame.Example.Monster.addTestf2(builder, testf2);
-  MyGame.Example.Monster.addTestf3(builder, testf3);
-  MyGame.Example.Monster.addTestarrayofstring2(builder, testarrayofstring2Offset);
-  MyGame.Example.Monster.addTestarrayofsortedstruct(builder, testarrayofsortedstructOffset);
-  MyGame.Example.Monster.addFlex(builder, flexOffset);
-  MyGame.Example.Monster.addTest5(builder, test5Offset);
-  MyGame.Example.Monster.addVectorOfLongs(builder, vectorOfLongsOffset);
-  MyGame.Example.Monster.addVectorOfDoubles(builder, vectorOfDoublesOffset);
-  MyGame.Example.Monster.addParentNamespaceTest(builder, parentNamespaceTestOffset);
-  MyGame.Example.Monster.addVectorOfReferrables(builder, vectorOfReferrablesOffset);
-  MyGame.Example.Monster.addSingleWeakReference(builder, singleWeakReference);
-  MyGame.Example.Monster.addVectorOfWeakReferences(builder, vectorOfWeakReferencesOffset);
-  MyGame.Example.Monster.addVectorOfStrongReferrables(builder, vectorOfStrongReferrablesOffset);
-  MyGame.Example.Monster.addCoOwningReference(builder, coOwningReference);
-  MyGame.Example.Monster.addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferencesOffset);
-  MyGame.Example.Monster.addNonOwningReference(builder, nonOwningReference);
-  MyGame.Example.Monster.addVectorOfNonOwningReferences(builder, vectorOfNonOwningReferencesOffset);
-  MyGame.Example.Monster.addAnyUniqueType(builder, anyUniqueType);
-  MyGame.Example.Monster.addAnyUnique(builder, anyUniqueOffset);
-  MyGame.Example.Monster.addAnyAmbiguousType(builder, anyAmbiguousType);
-  MyGame.Example.Monster.addAnyAmbiguous(builder, anyAmbiguousOffset);
-  MyGame.Example.Monster.addVectorOfEnums(builder, vectorOfEnumsOffset);
-  return MyGame.Example.Monster.endMonster(builder);
-}
-
-/**
  * @constructor
  */
 MyGame.Example.TypeAliases = function() {
@@ -2825,6 +2755,7 @@
  * @returns {MyGame.Example.TypeAliases}
  */
 MyGame.Example.TypeAliases.getSizePrefixedRootAsTypeAliases = function(bb, obj) {
+  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
   return (obj || new MyGame.Example.TypeAliases).__init(bb.readInt32(bb.position()) + bb.position(), bb);
 };
 
