diff --git a/tests/optional_scalars/OptionalByte.cs b/tests/optional_scalars/OptionalByte.cs
new file mode 100644
index 0000000..79a2004
--- /dev/null
+++ b/tests/optional_scalars/OptionalByte.cs
@@ -0,0 +1,16 @@
+// <auto-generated>
+//  automatically generated by the FlatBuffers compiler, do not modify
+// </auto-generated>
+
+namespace optional_scalars
+{
+
+public enum OptionalByte : sbyte
+{
+  None = 0,
+  One = 1,
+  Two = 2,
+};
+
+
+}
diff --git a/tests/optional_scalars/OptionalByte.java b/tests/optional_scalars/OptionalByte.java
new file mode 100644
index 0000000..2ca8475
--- /dev/null
+++ b/tests/optional_scalars/OptionalByte.java
@@ -0,0 +1,15 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars;
+
+public final class OptionalByte {
+  private OptionalByte() { }
+  public static final byte None = 0;
+  public static final byte One = 1;
+  public static final byte Two = 2;
+
+  public static final String[] names = { "None", "One", "Two", };
+
+  public static String name(int e) { return names[e]; }
+}
+
diff --git a/tests/optional_scalars/OptionalByte.kt b/tests/optional_scalars/OptionalByte.kt
new file mode 100644
index 0000000..41fe6cd
--- /dev/null
+++ b/tests/optional_scalars/OptionalByte.kt
@@ -0,0 +1,15 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars
+
+@Suppress("unused")
+@ExperimentalUnsignedTypes
+class OptionalByte private constructor() {
+    companion object {
+        const val None: Byte = 0
+        const val One: Byte = 1
+        const val Two: Byte = 2
+        val names : Array<String> = arrayOf("None", "One", "Two")
+        fun name(e: Int) : String = names[e]
+    }
+}
diff --git a/tests/optional_scalars/ScalarStuff.cs b/tests/optional_scalars/ScalarStuff.cs
new file mode 100644
index 0000000..a5c9ffb
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.cs
@@ -0,0 +1,183 @@
+// <auto-generated>
+//  automatically generated by the FlatBuffers compiler, do not modify
+// </auto-generated>
+
+namespace optional_scalars
+{
+
+using global::System;
+using global::System.Collections.Generic;
+using global::FlatBuffers;
+
+public struct ScalarStuff : IFlatbufferObject
+{
+  private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
+  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
+  public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb) { return GetRootAsScalarStuff(_bb, new ScalarStuff()); }
+  public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
+  public static bool ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "NULL"); }
+  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
+  public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+  public sbyte JustI8 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
+  public sbyte? MaybeI8 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte?)null; } }
+  public sbyte DefaultI8 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)42; } }
+  public byte JustU8 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
+  public byte? MaybeU8 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte?)null; } }
+  public byte DefaultU8 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)42; } }
+  public short JustI16 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)0; } }
+  public short? MaybeI16 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short?)null; } }
+  public short DefaultI16 { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)42; } }
+  public ushort JustU16 { get { int o = __p.__offset(22); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)0; } }
+  public ushort? MaybeU16 { get { int o = __p.__offset(24); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort?)null; } }
+  public ushort DefaultU16 { get { int o = __p.__offset(26); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)42; } }
+  public int JustI32 { get { int o = __p.__offset(28); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
+  public int? MaybeI32 { get { int o = __p.__offset(30); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int?)null; } }
+  public int DefaultI32 { get { int o = __p.__offset(32); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)42; } }
+  public uint JustU32 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
+  public uint? MaybeU32 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint?)null; } }
+  public uint DefaultU32 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)42; } }
+  public long JustI64 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }
+  public long? MaybeI64 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long?)null; } }
+  public long DefaultI64 { get { int o = __p.__offset(44); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)42; } }
+  public ulong JustU64 { get { int o = __p.__offset(46); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }
+  public ulong? MaybeU64 { get { int o = __p.__offset(48); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong?)null; } }
+  public ulong DefaultU64 { get { int o = __p.__offset(50); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)42; } }
+  public float JustF32 { get { int o = __p.__offset(52); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
+  public float? MaybeF32 { get { int o = __p.__offset(54); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float?)null; } }
+  public float DefaultF32 { get { int o = __p.__offset(56); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)42.0f; } }
+  public double JustF64 { get { int o = __p.__offset(58); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)0.0; } }
+  public double? MaybeF64 { get { int o = __p.__offset(60); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double?)null; } }
+  public double DefaultF64 { get { int o = __p.__offset(62); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)42.0; } }
+  public bool JustBool { get { int o = __p.__offset(64); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)false; } }
+  public bool? MaybeBool { get { int o = __p.__offset(66); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool?)null; } }
+  public bool DefaultBool { get { int o = __p.__offset(68); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)true; } }
+  public optional_scalars.OptionalByte JustEnum { get { int o = __p.__offset(70); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.None; } }
+  public optional_scalars.OptionalByte? MaybeEnum { get { int o = __p.__offset(72); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : (optional_scalars.OptionalByte?)null; } }
+  public optional_scalars.OptionalByte DefaultEnum { get { int o = __p.__offset(74); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.One; } }
+
+  public static Offset<optional_scalars.ScalarStuff> CreateScalarStuff(FlatBufferBuilder builder,
+      sbyte just_i8 = 0,
+      sbyte? maybe_i8 = null,
+      sbyte default_i8 = 42,
+      byte just_u8 = 0,
+      byte? maybe_u8 = null,
+      byte default_u8 = 42,
+      short just_i16 = 0,
+      short? maybe_i16 = null,
+      short default_i16 = 42,
+      ushort just_u16 = 0,
+      ushort? maybe_u16 = null,
+      ushort default_u16 = 42,
+      int just_i32 = 0,
+      int? maybe_i32 = null,
+      int default_i32 = 42,
+      uint just_u32 = 0,
+      uint? maybe_u32 = null,
+      uint default_u32 = 42,
+      long just_i64 = 0,
+      long? maybe_i64 = null,
+      long default_i64 = 42,
+      ulong just_u64 = 0,
+      ulong? maybe_u64 = null,
+      ulong default_u64 = 42,
+      float just_f32 = 0.0f,
+      float? maybe_f32 = null,
+      float default_f32 = 42.0f,
+      double just_f64 = 0.0,
+      double? maybe_f64 = null,
+      double default_f64 = 42.0,
+      bool just_bool = false,
+      bool? maybe_bool = null,
+      bool default_bool = true,
+      optional_scalars.OptionalByte just_enum = optional_scalars.OptionalByte.None,
+      optional_scalars.OptionalByte? maybe_enum = null,
+      optional_scalars.OptionalByte default_enum = optional_scalars.OptionalByte.One) {
+    builder.StartTable(36);
+    ScalarStuff.AddDefaultF64(builder, default_f64);
+    ScalarStuff.AddMaybeF64(builder, maybe_f64);
+    ScalarStuff.AddJustF64(builder, just_f64);
+    ScalarStuff.AddDefaultU64(builder, default_u64);
+    ScalarStuff.AddMaybeU64(builder, maybe_u64);
+    ScalarStuff.AddJustU64(builder, just_u64);
+    ScalarStuff.AddDefaultI64(builder, default_i64);
+    ScalarStuff.AddMaybeI64(builder, maybe_i64);
+    ScalarStuff.AddJustI64(builder, just_i64);
+    ScalarStuff.AddDefaultF32(builder, default_f32);
+    ScalarStuff.AddMaybeF32(builder, maybe_f32);
+    ScalarStuff.AddJustF32(builder, just_f32);
+    ScalarStuff.AddDefaultU32(builder, default_u32);
+    ScalarStuff.AddMaybeU32(builder, maybe_u32);
+    ScalarStuff.AddJustU32(builder, just_u32);
+    ScalarStuff.AddDefaultI32(builder, default_i32);
+    ScalarStuff.AddMaybeI32(builder, maybe_i32);
+    ScalarStuff.AddJustI32(builder, just_i32);
+    ScalarStuff.AddDefaultU16(builder, default_u16);
+    ScalarStuff.AddMaybeU16(builder, maybe_u16);
+    ScalarStuff.AddJustU16(builder, just_u16);
+    ScalarStuff.AddDefaultI16(builder, default_i16);
+    ScalarStuff.AddMaybeI16(builder, maybe_i16);
+    ScalarStuff.AddJustI16(builder, just_i16);
+    ScalarStuff.AddDefaultEnum(builder, default_enum);
+    ScalarStuff.AddMaybeEnum(builder, maybe_enum);
+    ScalarStuff.AddJustEnum(builder, just_enum);
+    ScalarStuff.AddDefaultBool(builder, default_bool);
+    ScalarStuff.AddMaybeBool(builder, maybe_bool);
+    ScalarStuff.AddJustBool(builder, just_bool);
+    ScalarStuff.AddDefaultU8(builder, default_u8);
+    ScalarStuff.AddMaybeU8(builder, maybe_u8);
+    ScalarStuff.AddJustU8(builder, just_u8);
+    ScalarStuff.AddDefaultI8(builder, default_i8);
+    ScalarStuff.AddMaybeI8(builder, maybe_i8);
+    ScalarStuff.AddJustI8(builder, just_i8);
+    return ScalarStuff.EndScalarStuff(builder);
+  }
+
+  public static void StartScalarStuff(FlatBufferBuilder builder) { builder.StartTable(36); }
+  public static void AddJustI8(FlatBufferBuilder builder, sbyte justI8) { builder.AddSbyte(0, justI8, 0); }
+  public static void AddMaybeI8(FlatBufferBuilder builder, sbyte? maybeI8) { builder.AddSbyte(1, maybeI8); }
+  public static void AddDefaultI8(FlatBufferBuilder builder, sbyte defaultI8) { builder.AddSbyte(2, defaultI8, 42); }
+  public static void AddJustU8(FlatBufferBuilder builder, byte justU8) { builder.AddByte(3, justU8, 0); }
+  public static void AddMaybeU8(FlatBufferBuilder builder, byte? maybeU8) { builder.AddByte(4, maybeU8); }
+  public static void AddDefaultU8(FlatBufferBuilder builder, byte defaultU8) { builder.AddByte(5, defaultU8, 42); }
+  public static void AddJustI16(FlatBufferBuilder builder, short justI16) { builder.AddShort(6, justI16, 0); }
+  public static void AddMaybeI16(FlatBufferBuilder builder, short? maybeI16) { builder.AddShort(7, maybeI16); }
+  public static void AddDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.AddShort(8, defaultI16, 42); }
+  public static void AddJustU16(FlatBufferBuilder builder, ushort justU16) { builder.AddUshort(9, justU16, 0); }
+  public static void AddMaybeU16(FlatBufferBuilder builder, ushort? maybeU16) { builder.AddUshort(10, maybeU16); }
+  public static void AddDefaultU16(FlatBufferBuilder builder, ushort defaultU16) { builder.AddUshort(11, defaultU16, 42); }
+  public static void AddJustI32(FlatBufferBuilder builder, int justI32) { builder.AddInt(12, justI32, 0); }
+  public static void AddMaybeI32(FlatBufferBuilder builder, int? maybeI32) { builder.AddInt(13, maybeI32); }
+  public static void AddDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.AddInt(14, defaultI32, 42); }
+  public static void AddJustU32(FlatBufferBuilder builder, uint justU32) { builder.AddUint(15, justU32, 0); }
+  public static void AddMaybeU32(FlatBufferBuilder builder, uint? maybeU32) { builder.AddUint(16, maybeU32); }
+  public static void AddDefaultU32(FlatBufferBuilder builder, uint defaultU32) { builder.AddUint(17, defaultU32, 42); }
+  public static void AddJustI64(FlatBufferBuilder builder, long justI64) { builder.AddLong(18, justI64, 0); }
+  public static void AddMaybeI64(FlatBufferBuilder builder, long? maybeI64) { builder.AddLong(19, maybeI64); }
+  public static void AddDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.AddLong(20, defaultI64, 42); }
+  public static void AddJustU64(FlatBufferBuilder builder, ulong justU64) { builder.AddUlong(21, justU64, 0); }
+  public static void AddMaybeU64(FlatBufferBuilder builder, ulong? maybeU64) { builder.AddUlong(22, maybeU64); }
+  public static void AddDefaultU64(FlatBufferBuilder builder, ulong defaultU64) { builder.AddUlong(23, defaultU64, 42); }
+  public static void AddJustF32(FlatBufferBuilder builder, float justF32) { builder.AddFloat(24, justF32, 0.0f); }
+  public static void AddMaybeF32(FlatBufferBuilder builder, float? maybeF32) { builder.AddFloat(25, maybeF32); }
+  public static void AddDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.AddFloat(26, defaultF32, 42.0f); }
+  public static void AddJustF64(FlatBufferBuilder builder, double justF64) { builder.AddDouble(27, justF64, 0.0); }
+  public static void AddMaybeF64(FlatBufferBuilder builder, double? maybeF64) { builder.AddDouble(28, maybeF64); }
+  public static void AddDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.AddDouble(29, defaultF64, 42.0); }
+  public static void AddJustBool(FlatBufferBuilder builder, bool justBool) { builder.AddBool(30, justBool, false); }
+  public static void AddMaybeBool(FlatBufferBuilder builder, bool? maybeBool) { builder.AddBool(31, maybeBool); }
+  public static void AddDefaultBool(FlatBufferBuilder builder, bool defaultBool) { builder.AddBool(32, defaultBool, true); }
+  public static void AddJustEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte justEnum) { builder.AddSbyte(33, (sbyte)justEnum, 0); }
+  public static void AddMaybeEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte? maybeEnum) { builder.AddSbyte(34, (sbyte)maybeEnum); }
+  public static void AddDefaultEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte defaultEnum) { builder.AddSbyte(35, (sbyte)defaultEnum, 1); }
+  public static Offset<optional_scalars.ScalarStuff> EndScalarStuff(FlatBufferBuilder builder) {
+    int o = builder.EndTable();
+    return new Offset<optional_scalars.ScalarStuff>(o);
+  }
+  public static void FinishScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.Finish(offset.Value, "NULL"); }
+  public static void FinishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.FinishSizePrefixed(offset.Value, "NULL"); }
+};
+
+
+}
diff --git a/tests/optional_scalars/ScalarStuff.java b/tests/optional_scalars/ScalarStuff.java
new file mode 100644
index 0000000..3689292
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.java
@@ -0,0 +1,196 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class ScalarStuff extends Table {
+  public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
+  public static ScalarStuff getRootAsScalarStuff(ByteBuffer _bb) { return getRootAsScalarStuff(_bb, new ScalarStuff()); }
+  public static ScalarStuff getRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+  public static boolean ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, "NULL"); }
+  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
+  public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+  public byte justI8() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }
+  public boolean hasMaybeI8() { return 0 != __offset(6); }
+  public byte maybeI8() { int o = __offset(6); return o != 0 ? bb.get(o + bb_pos) : 0; }
+  public byte defaultI8() { int o = __offset(8); return o != 0 ? bb.get(o + bb_pos) : 42; }
+  public int justU8() { int o = __offset(10); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }
+  public boolean hasMaybeU8() { return 0 != __offset(12); }
+  public int maybeU8() { int o = __offset(12); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }
+  public int defaultU8() { int o = __offset(14); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 42; }
+  public short justI16() { int o = __offset(16); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+  public boolean hasMaybeI16() { return 0 != __offset(18); }
+  public short maybeI16() { int o = __offset(18); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+  public short defaultI16() { int o = __offset(20); return o != 0 ? bb.getShort(o + bb_pos) : 42; }
+  public int justU16() { int o = __offset(22); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }
+  public boolean hasMaybeU16() { return 0 != __offset(24); }
+  public int maybeU16() { int o = __offset(24); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }
+  public int defaultU16() { int o = __offset(26); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 42; }
+  public int justI32() { int o = __offset(28); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
+  public boolean hasMaybeI32() { return 0 != __offset(30); }
+  public int maybeI32() { int o = __offset(30); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
+  public int defaultI32() { int o = __offset(32); return o != 0 ? bb.getInt(o + bb_pos) : 42; }
+  public long justU32() { int o = __offset(34); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }
+  public boolean hasMaybeU32() { return 0 != __offset(36); }
+  public long maybeU32() { int o = __offset(36); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }
+  public long defaultU32() { int o = __offset(38); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 42L; }
+  public long justI64() { int o = __offset(40); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+  public boolean hasMaybeI64() { return 0 != __offset(42); }
+  public long maybeI64() { int o = __offset(42); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+  public long defaultI64() { int o = __offset(44); return o != 0 ? bb.getLong(o + bb_pos) : 42L; }
+  public long justU64() { int o = __offset(46); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+  public boolean hasMaybeU64() { return 0 != __offset(48); }
+  public long maybeU64() { int o = __offset(48); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+  public long defaultU64() { int o = __offset(50); return o != 0 ? bb.getLong(o + bb_pos) : 42L; }
+  public float justF32() { int o = __offset(52); return o != 0 ? bb.getFloat(o + bb_pos) : 0.0f; }
+  public boolean hasMaybeF32() { return 0 != __offset(54); }
+  public float maybeF32() { int o = __offset(54); return o != 0 ? bb.getFloat(o + bb_pos) : 0f; }
+  public float defaultF32() { int o = __offset(56); return o != 0 ? bb.getFloat(o + bb_pos) : 42.0f; }
+  public double justF64() { int o = __offset(58); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }
+  public boolean hasMaybeF64() { return 0 != __offset(60); }
+  public double maybeF64() { int o = __offset(60); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }
+  public double defaultF64() { int o = __offset(62); return o != 0 ? bb.getDouble(o + bb_pos) : 42.0; }
+  public boolean justBool() { int o = __offset(64); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
+  public boolean hasMaybeBool() { return 0 != __offset(66); }
+  public boolean maybeBool() { int o = __offset(66); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
+  public boolean defaultBool() { int o = __offset(68); return o != 0 ? 0!=bb.get(o + bb_pos) : true; }
+  public byte justEnum() { int o = __offset(70); return o != 0 ? bb.get(o + bb_pos) : 0; }
+  public boolean hasMaybeEnum() { return 0 != __offset(72); }
+  public byte maybeEnum() { int o = __offset(72); return o != 0 ? bb.get(o + bb_pos) : 0; }
+  public byte defaultEnum() { int o = __offset(74); return o != 0 ? bb.get(o + bb_pos) : 1; }
+
+  public static int createScalarStuff(FlatBufferBuilder builder,
+      byte just_i8,
+      byte maybe_i8,
+      byte default_i8,
+      int just_u8,
+      int maybe_u8,
+      int default_u8,
+      short just_i16,
+      short maybe_i16,
+      short default_i16,
+      int just_u16,
+      int maybe_u16,
+      int default_u16,
+      int just_i32,
+      int maybe_i32,
+      int default_i32,
+      long just_u32,
+      long maybe_u32,
+      long default_u32,
+      long just_i64,
+      long maybe_i64,
+      long default_i64,
+      long just_u64,
+      long maybe_u64,
+      long default_u64,
+      float just_f32,
+      float maybe_f32,
+      float default_f32,
+      double just_f64,
+      double maybe_f64,
+      double default_f64,
+      boolean just_bool,
+      boolean maybe_bool,
+      boolean default_bool,
+      byte just_enum,
+      byte maybe_enum,
+      byte default_enum) {
+    builder.startTable(36);
+    ScalarStuff.addDefaultF64(builder, default_f64);
+    ScalarStuff.addMaybeF64(builder, maybe_f64);
+    ScalarStuff.addJustF64(builder, just_f64);
+    ScalarStuff.addDefaultU64(builder, default_u64);
+    ScalarStuff.addMaybeU64(builder, maybe_u64);
+    ScalarStuff.addJustU64(builder, just_u64);
+    ScalarStuff.addDefaultI64(builder, default_i64);
+    ScalarStuff.addMaybeI64(builder, maybe_i64);
+    ScalarStuff.addJustI64(builder, just_i64);
+    ScalarStuff.addDefaultF32(builder, default_f32);
+    ScalarStuff.addMaybeF32(builder, maybe_f32);
+    ScalarStuff.addJustF32(builder, just_f32);
+    ScalarStuff.addDefaultU32(builder, default_u32);
+    ScalarStuff.addMaybeU32(builder, maybe_u32);
+    ScalarStuff.addJustU32(builder, just_u32);
+    ScalarStuff.addDefaultI32(builder, default_i32);
+    ScalarStuff.addMaybeI32(builder, maybe_i32);
+    ScalarStuff.addJustI32(builder, just_i32);
+    ScalarStuff.addDefaultU16(builder, default_u16);
+    ScalarStuff.addMaybeU16(builder, maybe_u16);
+    ScalarStuff.addJustU16(builder, just_u16);
+    ScalarStuff.addDefaultI16(builder, default_i16);
+    ScalarStuff.addMaybeI16(builder, maybe_i16);
+    ScalarStuff.addJustI16(builder, just_i16);
+    ScalarStuff.addDefaultEnum(builder, default_enum);
+    ScalarStuff.addMaybeEnum(builder, maybe_enum);
+    ScalarStuff.addJustEnum(builder, just_enum);
+    ScalarStuff.addDefaultBool(builder, default_bool);
+    ScalarStuff.addMaybeBool(builder, maybe_bool);
+    ScalarStuff.addJustBool(builder, just_bool);
+    ScalarStuff.addDefaultU8(builder, default_u8);
+    ScalarStuff.addMaybeU8(builder, maybe_u8);
+    ScalarStuff.addJustU8(builder, just_u8);
+    ScalarStuff.addDefaultI8(builder, default_i8);
+    ScalarStuff.addMaybeI8(builder, maybe_i8);
+    ScalarStuff.addJustI8(builder, just_i8);
+    return ScalarStuff.endScalarStuff(builder);
+  }
+
+  public static void startScalarStuff(FlatBufferBuilder builder) { builder.startTable(36); }
+  public static void addJustI8(FlatBufferBuilder builder, byte justI8) { builder.addByte(0, justI8, 0); }
+  public static void addMaybeI8(FlatBufferBuilder builder, byte maybeI8) { builder.addByte(1, maybeI8, 0); }
+  public static void addDefaultI8(FlatBufferBuilder builder, byte defaultI8) { builder.addByte(2, defaultI8, 42); }
+  public static void addJustU8(FlatBufferBuilder builder, int justU8) { builder.addByte(3, (byte)justU8, (byte)0); }
+  public static void addMaybeU8(FlatBufferBuilder builder, int maybeU8) { builder.addByte(4, (byte)maybeU8, (byte)0); }
+  public static void addDefaultU8(FlatBufferBuilder builder, int defaultU8) { builder.addByte(5, (byte)defaultU8, (byte)42); }
+  public static void addJustI16(FlatBufferBuilder builder, short justI16) { builder.addShort(6, justI16, 0); }
+  public static void addMaybeI16(FlatBufferBuilder builder, short maybeI16) { builder.addShort(7, maybeI16, 0); }
+  public static void addDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.addShort(8, defaultI16, 42); }
+  public static void addJustU16(FlatBufferBuilder builder, int justU16) { builder.addShort(9, (short)justU16, (short)0); }
+  public static void addMaybeU16(FlatBufferBuilder builder, int maybeU16) { builder.addShort(10, (short)maybeU16, (short)0); }
+  public static void addDefaultU16(FlatBufferBuilder builder, int defaultU16) { builder.addShort(11, (short)defaultU16, (short)42); }
+  public static void addJustI32(FlatBufferBuilder builder, int justI32) { builder.addInt(12, justI32, 0); }
+  public static void addMaybeI32(FlatBufferBuilder builder, int maybeI32) { builder.addInt(13, maybeI32, 0); }
+  public static void addDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.addInt(14, defaultI32, 42); }
+  public static void addJustU32(FlatBufferBuilder builder, long justU32) { builder.addInt(15, (int)justU32, (int)0L); }
+  public static void addMaybeU32(FlatBufferBuilder builder, long maybeU32) { builder.addInt(16, (int)maybeU32, (int)0L); }
+  public static void addDefaultU32(FlatBufferBuilder builder, long defaultU32) { builder.addInt(17, (int)defaultU32, (int)42L); }
+  public static void addJustI64(FlatBufferBuilder builder, long justI64) { builder.addLong(18, justI64, 0L); }
+  public static void addMaybeI64(FlatBufferBuilder builder, long maybeI64) { builder.addLong(19, maybeI64, 0L); }
+  public static void addDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.addLong(20, defaultI64, 42L); }
+  public static void addJustU64(FlatBufferBuilder builder, long justU64) { builder.addLong(21, justU64, 0L); }
+  public static void addMaybeU64(FlatBufferBuilder builder, long maybeU64) { builder.addLong(22, maybeU64, 0L); }
+  public static void addDefaultU64(FlatBufferBuilder builder, long defaultU64) { builder.addLong(23, defaultU64, 42L); }
+  public static void addJustF32(FlatBufferBuilder builder, float justF32) { builder.addFloat(24, justF32, 0.0f); }
+  public static void addMaybeF32(FlatBufferBuilder builder, float maybeF32) { builder.addFloat(25, maybeF32, 0f); }
+  public static void addDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.addFloat(26, defaultF32, 42.0f); }
+  public static void addJustF64(FlatBufferBuilder builder, double justF64) { builder.addDouble(27, justF64, 0.0); }
+  public static void addMaybeF64(FlatBufferBuilder builder, double maybeF64) { builder.addDouble(28, maybeF64, 0.0); }
+  public static void addDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.addDouble(29, defaultF64, 42.0); }
+  public static void addJustBool(FlatBufferBuilder builder, boolean justBool) { builder.addBoolean(30, justBool, false); }
+  public static void addMaybeBool(FlatBufferBuilder builder, boolean maybeBool) { builder.addBoolean(31, maybeBool, false); }
+  public static void addDefaultBool(FlatBufferBuilder builder, boolean defaultBool) { builder.addBoolean(32, defaultBool, true); }
+  public static void addJustEnum(FlatBufferBuilder builder, byte justEnum) { builder.addByte(33, justEnum, 0); }
+  public static void addMaybeEnum(FlatBufferBuilder builder, byte maybeEnum) { builder.addByte(34, maybeEnum, 0); }
+  public static void addDefaultEnum(FlatBufferBuilder builder, byte defaultEnum) { builder.addByte(35, defaultEnum, 1); }
+  public static int endScalarStuff(FlatBufferBuilder builder) {
+    int o = builder.endTable();
+    return o;
+  }
+  public static void finishScalarStuffBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, "NULL"); }
+  public static void finishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, "NULL"); }
+
+  public static final class Vector extends BaseVector {
+    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+    public ScalarStuff get(int j) { return get(new ScalarStuff(), j); }
+    public ScalarStuff get(ScalarStuff obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }
+  }
+}
+
diff --git a/tests/optional_scalars/ScalarStuff.kt b/tests/optional_scalars/ScalarStuff.kt
new file mode 100644
index 0000000..5728384
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.kt
@@ -0,0 +1,292 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars
+
+import java.nio.*
+import kotlin.math.sign
+import com.google.flatbuffers.*
+
+@Suppress("unused")
+@ExperimentalUnsignedTypes
+class ScalarStuff : Table() {
+
+    fun __init(_i: Int, _bb: ByteBuffer)  {
+        __reset(_i, _bb)
+    }
+    fun __assign(_i: Int, _bb: ByteBuffer) : ScalarStuff {
+        __init(_i, _bb)
+        return this
+    }
+    val justI8 : Byte
+        get() {
+            val o = __offset(4)
+            return if(o != 0) bb.get(o + bb_pos) else 0
+        }
+    val maybeI8 : Byte?
+        get() {
+            val o = __offset(6)
+            return if(o != 0) bb.get(o + bb_pos) else null
+        }
+    val defaultI8 : Byte
+        get() {
+            val o = __offset(8)
+            return if(o != 0) bb.get(o + bb_pos) else 42
+        }
+    val justU8 : UByte
+        get() {
+            val o = __offset(10)
+            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u
+        }
+    val maybeU8 : UByte?
+        get() {
+            val o = __offset(12)
+            return if(o != 0) bb.get(o + bb_pos).toUByte() else null
+        }
+    val defaultU8 : UByte
+        get() {
+            val o = __offset(14)
+            return if(o != 0) bb.get(o + bb_pos).toUByte() else 42u
+        }
+    val justI16 : Short
+        get() {
+            val o = __offset(16)
+            return if(o != 0) bb.getShort(o + bb_pos) else 0
+        }
+    val maybeI16 : Short?
+        get() {
+            val o = __offset(18)
+            return if(o != 0) bb.getShort(o + bb_pos) else null
+        }
+    val defaultI16 : Short
+        get() {
+            val o = __offset(20)
+            return if(o != 0) bb.getShort(o + bb_pos) else 42
+        }
+    val justU16 : UShort
+        get() {
+            val o = __offset(22)
+            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u
+        }
+    val maybeU16 : UShort?
+        get() {
+            val o = __offset(24)
+            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else null
+        }
+    val defaultU16 : UShort
+        get() {
+            val o = __offset(26)
+            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 42u
+        }
+    val justI32 : Int
+        get() {
+            val o = __offset(28)
+            return if(o != 0) bb.getInt(o + bb_pos) else 0
+        }
+    val maybeI32 : Int?
+        get() {
+            val o = __offset(30)
+            return if(o != 0) bb.getInt(o + bb_pos) else null
+        }
+    val defaultI32 : Int
+        get() {
+            val o = __offset(32)
+            return if(o != 0) bb.getInt(o + bb_pos) else 42
+        }
+    val justU32 : UInt
+        get() {
+            val o = __offset(34)
+            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u
+        }
+    val maybeU32 : UInt?
+        get() {
+            val o = __offset(36)
+            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else null
+        }
+    val defaultU32 : UInt
+        get() {
+            val o = __offset(38)
+            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 42u
+        }
+    val justI64 : Long
+        get() {
+            val o = __offset(40)
+            return if(o != 0) bb.getLong(o + bb_pos) else 0L
+        }
+    val maybeI64 : Long?
+        get() {
+            val o = __offset(42)
+            return if(o != 0) bb.getLong(o + bb_pos) else null
+        }
+    val defaultI64 : Long
+        get() {
+            val o = __offset(44)
+            return if(o != 0) bb.getLong(o + bb_pos) else 42L
+        }
+    val justU64 : ULong
+        get() {
+            val o = __offset(46)
+            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL
+        }
+    val maybeU64 : ULong?
+        get() {
+            val o = __offset(48)
+            return if(o != 0) bb.getLong(o + bb_pos).toULong() else null
+        }
+    val defaultU64 : ULong
+        get() {
+            val o = __offset(50)
+            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 42UL
+        }
+    val justF32 : Float
+        get() {
+            val o = __offset(52)
+            return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f
+        }
+    val maybeF32 : Float?
+        get() {
+            val o = __offset(54)
+            return if(o != 0) bb.getFloat(o + bb_pos) else null
+        }
+    val defaultF32 : Float
+        get() {
+            val o = __offset(56)
+            return if(o != 0) bb.getFloat(o + bb_pos) else 42.0f
+        }
+    val justF64 : Double
+        get() {
+            val o = __offset(58)
+            return if(o != 0) bb.getDouble(o + bb_pos) else 0.0
+        }
+    val maybeF64 : Double?
+        get() {
+            val o = __offset(60)
+            return if(o != 0) bb.getDouble(o + bb_pos) else null
+        }
+    val defaultF64 : Double
+        get() {
+            val o = __offset(62)
+            return if(o != 0) bb.getDouble(o + bb_pos) else 42.0
+        }
+    val justBool : Boolean
+        get() {
+            val o = __offset(64)
+            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else false
+        }
+    val maybeBool : Boolean?
+        get() {
+            val o = __offset(66)
+            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else null
+        }
+    val defaultBool : Boolean
+        get() {
+            val o = __offset(68)
+            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else true
+        }
+    val justEnum : Byte
+        get() {
+            val o = __offset(70)
+            return if(o != 0) bb.get(o + bb_pos) else 0
+        }
+    val maybeEnum : Byte?
+        get() {
+            val o = __offset(72)
+            return if(o != 0) bb.get(o + bb_pos) else null
+        }
+    val defaultEnum : Byte
+        get() {
+            val o = __offset(74)
+            return if(o != 0) bb.get(o + bb_pos) else 1
+        }
+    companion object {
+        fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
+        fun getRootAsScalarStuff(_bb: ByteBuffer): ScalarStuff = getRootAsScalarStuff(_bb, ScalarStuff())
+        fun getRootAsScalarStuff(_bb: ByteBuffer, obj: ScalarStuff): ScalarStuff {
+            _bb.order(ByteOrder.LITTLE_ENDIAN)
+            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
+        }
+        fun ScalarStuffBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, "NULL")
+        fun createScalarStuff(builder: FlatBufferBuilder, justI8: Byte, maybeI8: Byte?, defaultI8: Byte, justU8: UByte, maybeU8: UByte?, defaultU8: UByte, justI16: Short, maybeI16: Short?, defaultI16: Short, justU16: UShort, maybeU16: UShort?, defaultU16: UShort, justI32: Int, maybeI32: Int?, defaultI32: Int, justU32: UInt, maybeU32: UInt?, defaultU32: UInt, justI64: Long, maybeI64: Long?, defaultI64: Long, justU64: ULong, maybeU64: ULong?, defaultU64: ULong, justF32: Float, maybeF32: Float?, defaultF32: Float, justF64: Double, maybeF64: Double?, defaultF64: Double, justBool: Boolean, maybeBool: Boolean?, defaultBool: Boolean, justEnum: Byte, maybeEnum: Byte?, defaultEnum: Byte) : Int {
+            builder.startTable(36)
+            addDefaultF64(builder, defaultF64)
+            maybeF64?.run { addMaybeF64(builder, maybeF64) }
+            addJustF64(builder, justF64)
+            addDefaultU64(builder, defaultU64)
+            maybeU64?.run { addMaybeU64(builder, maybeU64) }
+            addJustU64(builder, justU64)
+            addDefaultI64(builder, defaultI64)
+            maybeI64?.run { addMaybeI64(builder, maybeI64) }
+            addJustI64(builder, justI64)
+            addDefaultF32(builder, defaultF32)
+            maybeF32?.run { addMaybeF32(builder, maybeF32) }
+            addJustF32(builder, justF32)
+            addDefaultU32(builder, defaultU32)
+            maybeU32?.run { addMaybeU32(builder, maybeU32) }
+            addJustU32(builder, justU32)
+            addDefaultI32(builder, defaultI32)
+            maybeI32?.run { addMaybeI32(builder, maybeI32) }
+            addJustI32(builder, justI32)
+            addDefaultU16(builder, defaultU16)
+            maybeU16?.run { addMaybeU16(builder, maybeU16) }
+            addJustU16(builder, justU16)
+            addDefaultI16(builder, defaultI16)
+            maybeI16?.run { addMaybeI16(builder, maybeI16) }
+            addJustI16(builder, justI16)
+            addDefaultEnum(builder, defaultEnum)
+            maybeEnum?.run { addMaybeEnum(builder, maybeEnum) }
+            addJustEnum(builder, justEnum)
+            addDefaultBool(builder, defaultBool)
+            maybeBool?.run { addMaybeBool(builder, maybeBool) }
+            addJustBool(builder, justBool)
+            addDefaultU8(builder, defaultU8)
+            maybeU8?.run { addMaybeU8(builder, maybeU8) }
+            addJustU8(builder, justU8)
+            addDefaultI8(builder, defaultI8)
+            maybeI8?.run { addMaybeI8(builder, maybeI8) }
+            addJustI8(builder, justI8)
+            return endScalarStuff(builder)
+        }
+        fun startScalarStuff(builder: FlatBufferBuilder) = builder.startTable(36)
+        fun addJustI8(builder: FlatBufferBuilder, justI8: Byte) = builder.addByte(0, justI8, 0)
+        fun addMaybeI8(builder: FlatBufferBuilder, maybeI8: Byte) = builder.addByte(1, maybeI8, 0)
+        fun addDefaultI8(builder: FlatBufferBuilder, defaultI8: Byte) = builder.addByte(2, defaultI8, 42)
+        fun addJustU8(builder: FlatBufferBuilder, justU8: UByte) = builder.addByte(3, justU8.toByte(), 0)
+        fun addMaybeU8(builder: FlatBufferBuilder, maybeU8: UByte) = builder.addByte(4, maybeU8.toByte(), 0)
+        fun addDefaultU8(builder: FlatBufferBuilder, defaultU8: UByte) = builder.addByte(5, defaultU8.toByte(), 42)
+        fun addJustI16(builder: FlatBufferBuilder, justI16: Short) = builder.addShort(6, justI16, 0)
+        fun addMaybeI16(builder: FlatBufferBuilder, maybeI16: Short) = builder.addShort(7, maybeI16, 0)
+        fun addDefaultI16(builder: FlatBufferBuilder, defaultI16: Short) = builder.addShort(8, defaultI16, 42)
+        fun addJustU16(builder: FlatBufferBuilder, justU16: UShort) = builder.addShort(9, justU16.toShort(), 0)
+        fun addMaybeU16(builder: FlatBufferBuilder, maybeU16: UShort) = builder.addShort(10, maybeU16.toShort(), 0)
+        fun addDefaultU16(builder: FlatBufferBuilder, defaultU16: UShort) = builder.addShort(11, defaultU16.toShort(), 42)
+        fun addJustI32(builder: FlatBufferBuilder, justI32: Int) = builder.addInt(12, justI32, 0)
+        fun addMaybeI32(builder: FlatBufferBuilder, maybeI32: Int) = builder.addInt(13, maybeI32, 0)
+        fun addDefaultI32(builder: FlatBufferBuilder, defaultI32: Int) = builder.addInt(14, defaultI32, 42)
+        fun addJustU32(builder: FlatBufferBuilder, justU32: UInt) = builder.addInt(15, justU32.toInt(), 0)
+        fun addMaybeU32(builder: FlatBufferBuilder, maybeU32: UInt) = builder.addInt(16, maybeU32.toInt(), 0)
+        fun addDefaultU32(builder: FlatBufferBuilder, defaultU32: UInt) = builder.addInt(17, defaultU32.toInt(), 42)
+        fun addJustI64(builder: FlatBufferBuilder, justI64: Long) = builder.addLong(18, justI64, 0L)
+        fun addMaybeI64(builder: FlatBufferBuilder, maybeI64: Long) = builder.addLong(19, maybeI64, 0)
+        fun addDefaultI64(builder: FlatBufferBuilder, defaultI64: Long) = builder.addLong(20, defaultI64, 42L)
+        fun addJustU64(builder: FlatBufferBuilder, justU64: ULong) = builder.addLong(21, justU64.toLong(), 0)
+        fun addMaybeU64(builder: FlatBufferBuilder, maybeU64: ULong) = builder.addLong(22, maybeU64.toLong(), 0)
+        fun addDefaultU64(builder: FlatBufferBuilder, defaultU64: ULong) = builder.addLong(23, defaultU64.toLong(), 42)
+        fun addJustF32(builder: FlatBufferBuilder, justF32: Float) = builder.addFloat(24, justF32, 0.0)
+        fun addMaybeF32(builder: FlatBufferBuilder, maybeF32: Float) = builder.addFloat(25, maybeF32, 0.0)
+        fun addDefaultF32(builder: FlatBufferBuilder, defaultF32: Float) = builder.addFloat(26, defaultF32, 42.0)
+        fun addJustF64(builder: FlatBufferBuilder, justF64: Double) = builder.addDouble(27, justF64, 0.0)
+        fun addMaybeF64(builder: FlatBufferBuilder, maybeF64: Double) = builder.addDouble(28, maybeF64, 0.0)
+        fun addDefaultF64(builder: FlatBufferBuilder, defaultF64: Double) = builder.addDouble(29, defaultF64, 42.0)
+        fun addJustBool(builder: FlatBufferBuilder, justBool: Boolean) = builder.addBoolean(30, justBool, false)
+        fun addMaybeBool(builder: FlatBufferBuilder, maybeBool: Boolean) = builder.addBoolean(31, maybeBool, false)
+        fun addDefaultBool(builder: FlatBufferBuilder, defaultBool: Boolean) = builder.addBoolean(32, defaultBool, true)
+        fun addJustEnum(builder: FlatBufferBuilder, justEnum: Byte) = builder.addByte(33, justEnum, 0)
+        fun addMaybeEnum(builder: FlatBufferBuilder, maybeEnum: Byte) = builder.addByte(34, maybeEnum, 0)
+        fun addDefaultEnum(builder: FlatBufferBuilder, defaultEnum: Byte) = builder.addByte(35, defaultEnum, 1)
+        fun endScalarStuff(builder: FlatBufferBuilder) : Int {
+            val o = builder.endTable()
+            return o
+        }
+        fun finishScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, "NULL")
+        fun finishSizePrefixedScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, "NULL")
+    }
+}
