diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..fa78bd5
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "third_party/flatbuffers"]
+	path = third_party/flatbuffers
+	url = https://github.com/google/flatbuffers.git
diff --git a/.travis.yml b/.travis.yml
index e1ae0da..34a5fca 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -28,6 +28,7 @@
     - sudo apt-get install libgoogle-perftools-dev
     - sudo apt-get install python3 python3-dev
     - eval "${MATRIX_EVAL}"
+    - git submodule update --init --recursive
 
 install:
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 771e801..fafa1ea 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -197,6 +197,7 @@
 add_executable(surelog ${surelog_SRC})
 add_dependencies(surelog flatc)
 add_dependencies(surelog antlr4_static)
+add_dependencies(surelog flatbuffers)
 
 add_dependencies(surelog GenerateParser)
 add_dependencies(surelog GenerateSerializer)
@@ -210,5 +211,5 @@
 #)
 
 target_link_libraries(
-  surelog -L${PROJECT_SOURCE_DIR}/dist/ libantlr4-runtime.a dl util m rt pthread
+  surelog -L${PROJECT_SOURCE_DIR}/dist/ libantlr4-runtime.a -L${PROJECT_SOURCE_DIR}/build/third_party/flatbuffers libflatbuffers.a dl util m rt pthread
 )
diff --git a/INSTALL.md b/INSTALL.md
index 74107fd..be04204 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -22,6 +22,8 @@
 
 * Surelog Source code
   * git clone https://github.com/alainmarcel/Surelog.git
+  * cd Surelog
+  * git submodule update --init --recursive
 
 * Build
   * make
diff --git a/Makefile b/Makefile
index f7ba901..8e2017f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
 release:
 	mkdir -p build/tests;
 	mkdir -p dist;
-	cd build; cmake ../; make -j 4
-	cd build; ../src/release.tcl "release tcmalloc"
+	cd build; cmake ../ -DCMAKE_BUILD_TYPE=Release; make -j 4
+	cd build; ../src/release.tcl release show_diff
 	cd build; ../tests/regression.tcl mt=0
 
 test:
diff --git a/src/Cache/header_generated.h b/src/Cache/header_generated.h
index 596c8cf..9b9169e 100644
--- a/src/Cache/header_generated.h
+++ b/src/Cache/header_generated.h
@@ -18,7 +18,7 @@
 struct TimeInfo;
 
 struct Header FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_SL_VERSION = 4,
     VT_M_FLB_VERSION = 6,
     VT_M_SL_DATE_COMPILED = 8,
@@ -42,16 +42,16 @@
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_SL_VERSION) &&
-           verifier.Verify(m_sl_version()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_FLB_VERSION) &&
-           verifier.Verify(m_flb_version()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_SL_DATE_COMPILED) &&
-           verifier.Verify(m_sl_date_compiled()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_FILE_DATE_COMPILED) &&
-           verifier.Verify(m_file_date_compiled()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_FILE) &&
-           verifier.Verify(m_file()) &&
+           VerifyOffset(verifier, VT_M_SL_VERSION) &&
+           verifier.VerifyString(m_sl_version()) &&
+           VerifyOffset(verifier, VT_M_FLB_VERSION) &&
+           verifier.VerifyString(m_flb_version()) &&
+           VerifyOffset(verifier, VT_M_SL_DATE_COMPILED) &&
+           verifier.VerifyString(m_sl_date_compiled()) &&
+           VerifyOffset(verifier, VT_M_FILE_DATE_COMPILED) &&
+           verifier.VerifyString(m_file_date_compiled()) &&
+           VerifyOffset(verifier, VT_M_FILE) &&
+           verifier.VerifyString(m_file()) &&
            verifier.EndTable();
   }
 };
@@ -74,13 +74,13 @@
   void add_m_file(flatbuffers::Offset<flatbuffers::String> m_file) {
     fbb_.AddOffset(Header::VT_M_FILE, m_file);
   }
-  HeaderBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit HeaderBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   HeaderBuilder &operator=(const HeaderBuilder &);
   flatbuffers::Offset<Header> Finish() {
-    const auto end = fbb_.EndTable(start_, 5);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<Header>(end);
     return o;
   }
@@ -109,30 +109,35 @@
     const char *m_sl_date_compiled = nullptr,
     const char *m_file_date_compiled = nullptr,
     const char *m_file = nullptr) {
+  auto m_sl_version__ = m_sl_version ? _fbb.CreateString(m_sl_version) : 0;
+  auto m_flb_version__ = m_flb_version ? _fbb.CreateString(m_flb_version) : 0;
+  auto m_sl_date_compiled__ = m_sl_date_compiled ? _fbb.CreateString(m_sl_date_compiled) : 0;
+  auto m_file_date_compiled__ = m_file_date_compiled ? _fbb.CreateString(m_file_date_compiled) : 0;
+  auto m_file__ = m_file ? _fbb.CreateString(m_file) : 0;
   return SURELOG::CACHE::CreateHeader(
       _fbb,
-      m_sl_version ? _fbb.CreateString(m_sl_version) : 0,
-      m_flb_version ? _fbb.CreateString(m_flb_version) : 0,
-      m_sl_date_compiled ? _fbb.CreateString(m_sl_date_compiled) : 0,
-      m_file_date_compiled ? _fbb.CreateString(m_file_date_compiled) : 0,
-      m_file ? _fbb.CreateString(m_file) : 0);
+      m_sl_version__,
+      m_flb_version__,
+      m_sl_date_compiled__,
+      m_file_date_compiled__,
+      m_file__);
 }
 
 struct Error FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_LOCATIONS = 4,
     VT_M_ERRORID = 6
   };
-  const flatbuffers::Vector<flatbuffers::Offset<Location>> *m_locations() const {
-    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<Location>> *>(VT_M_LOCATIONS);
+  const flatbuffers::Vector<flatbuffers::Offset<SURELOG::CACHE::Location>> *m_locations() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<SURELOG::CACHE::Location>> *>(VT_M_LOCATIONS);
   }
   uint32_t m_errorId() const {
     return GetField<uint32_t>(VT_M_ERRORID, 0);
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_LOCATIONS) &&
-           verifier.Verify(m_locations()) &&
+           VerifyOffset(verifier, VT_M_LOCATIONS) &&
+           verifier.VerifyVector(m_locations()) &&
            verifier.VerifyVectorOfTables(m_locations()) &&
            VerifyField<uint32_t>(verifier, VT_M_ERRORID) &&
            verifier.EndTable();
@@ -142,19 +147,19 @@
 struct ErrorBuilder {
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
-  void add_m_locations(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Location>>> m_locations) {
+  void add_m_locations(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::CACHE::Location>>> m_locations) {
     fbb_.AddOffset(Error::VT_M_LOCATIONS, m_locations);
   }
   void add_m_errorId(uint32_t m_errorId) {
     fbb_.AddElement<uint32_t>(Error::VT_M_ERRORID, m_errorId, 0);
   }
-  ErrorBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit ErrorBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   ErrorBuilder &operator=(const ErrorBuilder &);
   flatbuffers::Offset<Error> Finish() {
-    const auto end = fbb_.EndTable(start_, 2);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<Error>(end);
     return o;
   }
@@ -162,7 +167,7 @@
 
 inline flatbuffers::Offset<Error> CreateError(
     flatbuffers::FlatBufferBuilder &_fbb,
-    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Location>>> m_locations = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::CACHE::Location>>> m_locations = 0,
     uint32_t m_errorId = 0) {
   ErrorBuilder builder_(_fbb);
   builder_.add_m_errorId(m_errorId);
@@ -172,16 +177,17 @@
 
 inline flatbuffers::Offset<Error> CreateErrorDirect(
     flatbuffers::FlatBufferBuilder &_fbb,
-    const std::vector<flatbuffers::Offset<Location>> *m_locations = nullptr,
+    const std::vector<flatbuffers::Offset<SURELOG::CACHE::Location>> *m_locations = nullptr,
     uint32_t m_errorId = 0) {
+  auto m_locations__ = m_locations ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::Location>>(*m_locations) : 0;
   return SURELOG::CACHE::CreateError(
       _fbb,
-      m_locations ? _fbb.CreateVector<flatbuffers::Offset<Location>>(*m_locations) : 0,
+      m_locations__,
       m_errorId);
 }
 
 struct Location FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_FILEID = 4,
     VT_M_LINE = 6,
     VT_M_COLUMN = 8,
@@ -224,13 +230,13 @@
   void add_m_object(uint64_t m_object) {
     fbb_.AddElement<uint64_t>(Location::VT_M_OBJECT, m_object, 0);
   }
-  LocationBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit LocationBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   LocationBuilder &operator=(const LocationBuilder &);
   flatbuffers::Offset<Location> Finish() {
-    const auto end = fbb_.EndTable(start_, 4);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<Location>(end);
     return o;
   }
@@ -251,7 +257,7 @@
 }
 
 struct TimeInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_TYPE = 4,
     VT_M_FILEID = 6,
     VT_M_LINE = 8,
@@ -318,13 +324,13 @@
   void add_m_timePrecisionValue(double m_timePrecisionValue) {
     fbb_.AddElement<double>(TimeInfo::VT_M_TIMEPRECISIONVALUE, m_timePrecisionValue, 0.0);
   }
-  TimeInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit TimeInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   TimeInfoBuilder &operator=(const TimeInfoBuilder &);
   flatbuffers::Offset<TimeInfo> Finish() {
-    const auto end = fbb_.EndTable(start_, 7);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<TimeInfo>(end);
     return o;
   }
diff --git a/src/Cache/parser_generated.h b/src/Cache/parser_generated.h
index 767195f..718684c 100644
--- a/src/Cache/parser_generated.h
+++ b/src/Cache/parser_generated.h
@@ -17,7 +17,7 @@
 
 struct ParseCache;
 
-MANUALLY_ALIGNED_STRUCT(8) VObject FLATBUFFERS_FINAL_CLASS {
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) VObject FLATBUFFERS_FINAL_CLASS {
  private:
   uint64_t m_field1_;
   uint64_t m_field2_;
@@ -25,10 +25,7 @@
 
  public:
   VObject() {
-    memset(this, 0, sizeof(VObject));
-  }
-  VObject(const VObject &_o) {
-    memcpy(this, &_o, sizeof(VObject));
+    memset(static_cast<void *>(this), 0, sizeof(VObject));
   }
   VObject(uint64_t _m_field1, uint64_t _m_field2, uint64_t _m_field3)
       : m_field1_(flatbuffers::EndianScalar(_m_field1)),
@@ -45,10 +42,10 @@
     return flatbuffers::EndianScalar(m_field3_);
   }
 };
-STRUCT_END(VObject, 24);
+FLATBUFFERS_STRUCT_END(VObject, 24);
 
 struct DesignElement FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_NAME = 4,
     VT_M_FILEID = 6,
     VT_M_TYPE = 8,
@@ -89,7 +86,7 @@
            VerifyField<uint32_t>(verifier, VT_M_TYPE) &&
            VerifyField<uint64_t>(verifier, VT_M_UNIQUEID) &&
            VerifyField<uint32_t>(verifier, VT_M_LINE) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_TIMEINFO) &&
+           VerifyOffset(verifier, VT_M_TIMEINFO) &&
            verifier.VerifyTable(m_timeInfo()) &&
            VerifyField<uint64_t>(verifier, VT_M_PARENT) &&
            VerifyField<uint32_t>(verifier, VT_M_NODE) &&
@@ -124,13 +121,13 @@
   void add_m_node(uint32_t m_node) {
     fbb_.AddElement<uint32_t>(DesignElement::VT_M_NODE, m_node, 0);
   }
-  DesignElementBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit DesignElementBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   DesignElementBuilder &operator=(const DesignElementBuilder &);
   flatbuffers::Offset<DesignElement> Finish() {
-    const auto end = fbb_.EndTable(start_, 8);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<DesignElement>(end);
     return o;
   }
@@ -159,7 +156,7 @@
 }
 
 struct ParseCache FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_HEADER = 4,
     VT_M_ERRORS = 6,
     VT_M_SYMBOLS = 8,
@@ -175,27 +172,27 @@
   const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *m_symbols() const {
     return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_M_SYMBOLS);
   }
-  const flatbuffers::Vector<flatbuffers::Offset<DesignElement>> *m_elements() const {
-    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<DesignElement>> *>(VT_M_ELEMENTS);
+  const flatbuffers::Vector<flatbuffers::Offset<SURELOG::PARSECACHE::DesignElement>> *m_elements() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<SURELOG::PARSECACHE::DesignElement>> *>(VT_M_ELEMENTS);
   }
-  const flatbuffers::Vector<const VObject *> *m_objects() const {
-    return GetPointer<const flatbuffers::Vector<const VObject *> *>(VT_M_OBJECTS);
+  const flatbuffers::Vector<const SURELOG::PARSECACHE::VObject *> *m_objects() const {
+    return GetPointer<const flatbuffers::Vector<const SURELOG::PARSECACHE::VObject *> *>(VT_M_OBJECTS);
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_HEADER) &&
+           VerifyOffset(verifier, VT_M_HEADER) &&
            verifier.VerifyTable(m_header()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_ERRORS) &&
-           verifier.Verify(m_errors()) &&
+           VerifyOffset(verifier, VT_M_ERRORS) &&
+           verifier.VerifyVector(m_errors()) &&
            verifier.VerifyVectorOfTables(m_errors()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_SYMBOLS) &&
-           verifier.Verify(m_symbols()) &&
+           VerifyOffset(verifier, VT_M_SYMBOLS) &&
+           verifier.VerifyVector(m_symbols()) &&
            verifier.VerifyVectorOfStrings(m_symbols()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_ELEMENTS) &&
-           verifier.Verify(m_elements()) &&
+           VerifyOffset(verifier, VT_M_ELEMENTS) &&
+           verifier.VerifyVector(m_elements()) &&
            verifier.VerifyVectorOfTables(m_elements()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_OBJECTS) &&
-           verifier.Verify(m_objects()) &&
+           VerifyOffset(verifier, VT_M_OBJECTS) &&
+           verifier.VerifyVector(m_objects()) &&
            verifier.EndTable();
   }
 };
@@ -212,19 +209,19 @@
   void add_m_symbols(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> m_symbols) {
     fbb_.AddOffset(ParseCache::VT_M_SYMBOLS, m_symbols);
   }
-  void add_m_elements(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<DesignElement>>> m_elements) {
+  void add_m_elements(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::PARSECACHE::DesignElement>>> m_elements) {
     fbb_.AddOffset(ParseCache::VT_M_ELEMENTS, m_elements);
   }
-  void add_m_objects(flatbuffers::Offset<flatbuffers::Vector<const VObject *>> m_objects) {
+  void add_m_objects(flatbuffers::Offset<flatbuffers::Vector<const SURELOG::PARSECACHE::VObject *>> m_objects) {
     fbb_.AddOffset(ParseCache::VT_M_OBJECTS, m_objects);
   }
-  ParseCacheBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit ParseCacheBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   ParseCacheBuilder &operator=(const ParseCacheBuilder &);
   flatbuffers::Offset<ParseCache> Finish() {
-    const auto end = fbb_.EndTable(start_, 5);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<ParseCache>(end);
     return o;
   }
@@ -235,8 +232,8 @@
     flatbuffers::Offset<SURELOG::CACHE::Header> m_header = 0,
     flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::CACHE::Error>>> m_errors = 0,
     flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> m_symbols = 0,
-    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<DesignElement>>> m_elements = 0,
-    flatbuffers::Offset<flatbuffers::Vector<const VObject *>> m_objects = 0) {
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::PARSECACHE::DesignElement>>> m_elements = 0,
+    flatbuffers::Offset<flatbuffers::Vector<const SURELOG::PARSECACHE::VObject *>> m_objects = 0) {
   ParseCacheBuilder builder_(_fbb);
   builder_.add_m_objects(m_objects);
   builder_.add_m_elements(m_elements);
@@ -251,21 +248,29 @@
     flatbuffers::Offset<SURELOG::CACHE::Header> m_header = 0,
     const std::vector<flatbuffers::Offset<SURELOG::CACHE::Error>> *m_errors = nullptr,
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *m_symbols = nullptr,
-    const std::vector<flatbuffers::Offset<DesignElement>> *m_elements = nullptr,
-    const std::vector<const VObject *> *m_objects = nullptr) {
+    const std::vector<flatbuffers::Offset<SURELOG::PARSECACHE::DesignElement>> *m_elements = nullptr,
+    const std::vector<SURELOG::PARSECACHE::VObject> *m_objects = nullptr) {
+  auto m_errors__ = m_errors ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::Error>>(*m_errors) : 0;
+  auto m_symbols__ = m_symbols ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_symbols) : 0;
+  auto m_elements__ = m_elements ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::PARSECACHE::DesignElement>>(*m_elements) : 0;
+  auto m_objects__ = m_objects ? _fbb.CreateVectorOfStructs<SURELOG::PARSECACHE::VObject>(*m_objects) : 0;
   return SURELOG::PARSECACHE::CreateParseCache(
       _fbb,
       m_header,
-      m_errors ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::Error>>(*m_errors) : 0,
-      m_symbols ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_symbols) : 0,
-      m_elements ? _fbb.CreateVector<flatbuffers::Offset<DesignElement>>(*m_elements) : 0,
-      m_objects ? _fbb.CreateVector<const VObject *>(*m_objects) : 0);
+      m_errors__,
+      m_symbols__,
+      m_elements__,
+      m_objects__);
 }
 
 inline const SURELOG::PARSECACHE::ParseCache *GetParseCache(const void *buf) {
   return flatbuffers::GetRoot<SURELOG::PARSECACHE::ParseCache>(buf);
 }
 
+inline const SURELOG::PARSECACHE::ParseCache *GetSizePrefixedParseCache(const void *buf) {
+  return flatbuffers::GetSizePrefixedRoot<SURELOG::PARSECACHE::ParseCache>(buf);
+}
+
 inline const char *ParseCacheIdentifier() {
   return "SLPA";
 }
@@ -280,6 +285,11 @@
   return verifier.VerifyBuffer<SURELOG::PARSECACHE::ParseCache>(ParseCacheIdentifier());
 }
 
+inline bool VerifySizePrefixedParseCacheBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifySizePrefixedBuffer<SURELOG::PARSECACHE::ParseCache>(ParseCacheIdentifier());
+}
+
 inline const char *ParseCacheExtension() {
   return "slpa";
 }
@@ -290,6 +300,12 @@
   fbb.Finish(root, ParseCacheIdentifier());
 }
 
+inline void FinishSizePrefixedParseCacheBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<SURELOG::PARSECACHE::ParseCache> root) {
+  fbb.FinishSizePrefixed(root, ParseCacheIdentifier());
+}
+
 }  // namespace PARSECACHE
 }  // namespace SURELOG
 
diff --git a/src/Cache/preproc_generated.h b/src/Cache/preproc_generated.h
index 642a082..bf000e7 100644
--- a/src/Cache/preproc_generated.h
+++ b/src/Cache/preproc_generated.h
@@ -22,8 +22,16 @@
   MacroType_MAX = MacroType_WITH_ARGS
 };
 
-inline const char **EnumNamesMacroType() {
-  static const char *names[] = {
+inline const MacroType (&EnumValuesMacroType())[2] {
+  static const MacroType values[] = {
+    MacroType_NO_ARGS,
+    MacroType_WITH_ARGS
+  };
+  return values;
+}
+
+inline const char * const *EnumNamesMacroType() {
+  static const char * const names[3] = {
     "NO_ARGS",
     "WITH_ARGS",
     nullptr
@@ -32,12 +40,13 @@
 }
 
 inline const char *EnumNameMacroType(MacroType e) {
-  const size_t index = static_cast<int>(e);
+  if (e < MacroType_NO_ARGS || e > MacroType_WITH_ARGS) return "";
+  const size_t index = static_cast<size_t>(e);
   return EnumNamesMacroType()[index];
 }
 
 struct Macro FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_NAME = 4,
     VT_M_TYPE = 6,
     VT_M_LINE = 8,
@@ -48,8 +57,8 @@
   const flatbuffers::String *m_name() const {
     return GetPointer<const flatbuffers::String *>(VT_M_NAME);
   }
-  MacroType m_type() const {
-    return static_cast<MacroType>(GetField<int8_t>(VT_M_TYPE, 0));
+  SURELOG::MACROCACHE::MacroType m_type() const {
+    return static_cast<SURELOG::MACROCACHE::MacroType>(GetField<int8_t>(VT_M_TYPE, 0));
   }
   uint32_t m_line() const {
     return GetField<uint32_t>(VT_M_LINE, 0);
@@ -65,16 +74,16 @@
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_NAME) &&
-           verifier.Verify(m_name()) &&
+           VerifyOffset(verifier, VT_M_NAME) &&
+           verifier.VerifyString(m_name()) &&
            VerifyField<int8_t>(verifier, VT_M_TYPE) &&
            VerifyField<uint32_t>(verifier, VT_M_LINE) &&
            VerifyField<uint16_t>(verifier, VT_M_COLUMN) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_ARGUMENTS) &&
-           verifier.Verify(m_arguments()) &&
+           VerifyOffset(verifier, VT_M_ARGUMENTS) &&
+           verifier.VerifyVector(m_arguments()) &&
            verifier.VerifyVectorOfStrings(m_arguments()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_TOKENS) &&
-           verifier.Verify(m_tokens()) &&
+           VerifyOffset(verifier, VT_M_TOKENS) &&
+           verifier.VerifyVector(m_tokens()) &&
            verifier.VerifyVectorOfStrings(m_tokens()) &&
            verifier.EndTable();
   }
@@ -86,7 +95,7 @@
   void add_m_name(flatbuffers::Offset<flatbuffers::String> m_name) {
     fbb_.AddOffset(Macro::VT_M_NAME, m_name);
   }
-  void add_m_type(MacroType m_type) {
+  void add_m_type(SURELOG::MACROCACHE::MacroType m_type) {
     fbb_.AddElement<int8_t>(Macro::VT_M_TYPE, static_cast<int8_t>(m_type), 0);
   }
   void add_m_line(uint32_t m_line) {
@@ -101,13 +110,13 @@
   void add_m_tokens(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> m_tokens) {
     fbb_.AddOffset(Macro::VT_M_TOKENS, m_tokens);
   }
-  MacroBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit MacroBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   MacroBuilder &operator=(const MacroBuilder &);
   flatbuffers::Offset<Macro> Finish() {
-    const auto end = fbb_.EndTable(start_, 6);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<Macro>(end);
     return o;
   }
@@ -116,7 +125,7 @@
 inline flatbuffers::Offset<Macro> CreateMacro(
     flatbuffers::FlatBufferBuilder &_fbb,
     flatbuffers::Offset<flatbuffers::String> m_name = 0,
-    MacroType m_type = MacroType_NO_ARGS,
+    SURELOG::MACROCACHE::MacroType m_type = SURELOG::MACROCACHE::MacroType_NO_ARGS,
     uint32_t m_line = 0,
     uint16_t m_column = 0,
     flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> m_arguments = 0,
@@ -134,23 +143,26 @@
 inline flatbuffers::Offset<Macro> CreateMacroDirect(
     flatbuffers::FlatBufferBuilder &_fbb,
     const char *m_name = nullptr,
-    MacroType m_type = MacroType_NO_ARGS,
+    SURELOG::MACROCACHE::MacroType m_type = SURELOG::MACROCACHE::MacroType_NO_ARGS,
     uint32_t m_line = 0,
     uint16_t m_column = 0,
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *m_arguments = nullptr,
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *m_tokens = nullptr) {
+  auto m_name__ = m_name ? _fbb.CreateString(m_name) : 0;
+  auto m_arguments__ = m_arguments ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_arguments) : 0;
+  auto m_tokens__ = m_tokens ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_tokens) : 0;
   return SURELOG::MACROCACHE::CreateMacro(
       _fbb,
-      m_name ? _fbb.CreateString(m_name) : 0,
+      m_name__,
       m_type,
       m_line,
       m_column,
-      m_arguments ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_arguments) : 0,
-      m_tokens ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_tokens) : 0);
+      m_arguments__,
+      m_tokens__);
 }
 
 struct PPCache FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_HEADER = 4,
     VT_M_MACROS = 6,
     VT_M_INCLUDES = 8,
@@ -164,8 +176,8 @@
   const SURELOG::CACHE::Header *m_header() const {
     return GetPointer<const SURELOG::CACHE::Header *>(VT_M_HEADER);
   }
-  const flatbuffers::Vector<flatbuffers::Offset<Macro>> *m_macros() const {
-    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<Macro>> *>(VT_M_MACROS);
+  const flatbuffers::Vector<flatbuffers::Offset<SURELOG::MACROCACHE::Macro>> *m_macros() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<SURELOG::MACROCACHE::Macro>> *>(VT_M_MACROS);
   }
   const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *m_includes() const {
     return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_M_INCLUDES);
@@ -190,30 +202,30 @@
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_HEADER) &&
+           VerifyOffset(verifier, VT_M_HEADER) &&
            verifier.VerifyTable(m_header()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_MACROS) &&
-           verifier.Verify(m_macros()) &&
+           VerifyOffset(verifier, VT_M_MACROS) &&
+           verifier.VerifyVector(m_macros()) &&
            verifier.VerifyVectorOfTables(m_macros()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_INCLUDES) &&
-           verifier.Verify(m_includes()) &&
+           VerifyOffset(verifier, VT_M_INCLUDES) &&
+           verifier.VerifyVector(m_includes()) &&
            verifier.VerifyVectorOfStrings(m_includes()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_BODY) &&
-           verifier.Verify(m_body()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_ERRORS) &&
-           verifier.Verify(m_errors()) &&
+           VerifyOffset(verifier, VT_M_BODY) &&
+           verifier.VerifyString(m_body()) &&
+           VerifyOffset(verifier, VT_M_ERRORS) &&
+           verifier.VerifyVector(m_errors()) &&
            verifier.VerifyVectorOfTables(m_errors()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_SYMBOLS) &&
-           verifier.Verify(m_symbols()) &&
+           VerifyOffset(verifier, VT_M_SYMBOLS) &&
+           verifier.VerifyVector(m_symbols()) &&
            verifier.VerifyVectorOfStrings(m_symbols()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_CMD_INCLUDE_PATHS) &&
-           verifier.Verify(m_cmd_include_paths()) &&
+           VerifyOffset(verifier, VT_M_CMD_INCLUDE_PATHS) &&
+           verifier.VerifyVector(m_cmd_include_paths()) &&
            verifier.VerifyVectorOfStrings(m_cmd_include_paths()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_CMD_DEFINE_OPTIONS) &&
-           verifier.Verify(m_cmd_define_options()) &&
+           VerifyOffset(verifier, VT_M_CMD_DEFINE_OPTIONS) &&
+           verifier.VerifyVector(m_cmd_define_options()) &&
            verifier.VerifyVectorOfStrings(m_cmd_define_options()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_TIMEINFO) &&
-           verifier.Verify(m_timeInfo()) &&
+           VerifyOffset(verifier, VT_M_TIMEINFO) &&
+           verifier.VerifyVector(m_timeInfo()) &&
            verifier.VerifyVectorOfTables(m_timeInfo()) &&
            verifier.EndTable();
   }
@@ -225,7 +237,7 @@
   void add_m_header(flatbuffers::Offset<SURELOG::CACHE::Header> m_header) {
     fbb_.AddOffset(PPCache::VT_M_HEADER, m_header);
   }
-  void add_m_macros(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Macro>>> m_macros) {
+  void add_m_macros(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::MACROCACHE::Macro>>> m_macros) {
     fbb_.AddOffset(PPCache::VT_M_MACROS, m_macros);
   }
   void add_m_includes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> m_includes) {
@@ -249,13 +261,13 @@
   void add_m_timeInfo(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::CACHE::TimeInfo>>> m_timeInfo) {
     fbb_.AddOffset(PPCache::VT_M_TIMEINFO, m_timeInfo);
   }
-  PPCacheBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit PPCacheBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   PPCacheBuilder &operator=(const PPCacheBuilder &);
   flatbuffers::Offset<PPCache> Finish() {
-    const auto end = fbb_.EndTable(start_, 9);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<PPCache>(end);
     return o;
   }
@@ -264,7 +276,7 @@
 inline flatbuffers::Offset<PPCache> CreatePPCache(
     flatbuffers::FlatBufferBuilder &_fbb,
     flatbuffers::Offset<SURELOG::CACHE::Header> m_header = 0,
-    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Macro>>> m_macros = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::MACROCACHE::Macro>>> m_macros = 0,
     flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> m_includes = 0,
     flatbuffers::Offset<flatbuffers::String> m_body = 0,
     flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<SURELOG::CACHE::Error>>> m_errors = 0,
@@ -288,7 +300,7 @@
 inline flatbuffers::Offset<PPCache> CreatePPCacheDirect(
     flatbuffers::FlatBufferBuilder &_fbb,
     flatbuffers::Offset<SURELOG::CACHE::Header> m_header = 0,
-    const std::vector<flatbuffers::Offset<Macro>> *m_macros = nullptr,
+    const std::vector<flatbuffers::Offset<SURELOG::MACROCACHE::Macro>> *m_macros = nullptr,
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *m_includes = nullptr,
     const char *m_body = nullptr,
     const std::vector<flatbuffers::Offset<SURELOG::CACHE::Error>> *m_errors = nullptr,
@@ -296,23 +308,35 @@
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *m_cmd_include_paths = nullptr,
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *m_cmd_define_options = nullptr,
     const std::vector<flatbuffers::Offset<SURELOG::CACHE::TimeInfo>> *m_timeInfo = nullptr) {
+  auto m_macros__ = m_macros ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::MACROCACHE::Macro>>(*m_macros) : 0;
+  auto m_includes__ = m_includes ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_includes) : 0;
+  auto m_body__ = m_body ? _fbb.CreateString(m_body) : 0;
+  auto m_errors__ = m_errors ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::Error>>(*m_errors) : 0;
+  auto m_symbols__ = m_symbols ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_symbols) : 0;
+  auto m_cmd_include_paths__ = m_cmd_include_paths ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_cmd_include_paths) : 0;
+  auto m_cmd_define_options__ = m_cmd_define_options ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_cmd_define_options) : 0;
+  auto m_timeInfo__ = m_timeInfo ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::TimeInfo>>(*m_timeInfo) : 0;
   return SURELOG::MACROCACHE::CreatePPCache(
       _fbb,
       m_header,
-      m_macros ? _fbb.CreateVector<flatbuffers::Offset<Macro>>(*m_macros) : 0,
-      m_includes ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_includes) : 0,
-      m_body ? _fbb.CreateString(m_body) : 0,
-      m_errors ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::Error>>(*m_errors) : 0,
-      m_symbols ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_symbols) : 0,
-      m_cmd_include_paths ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_cmd_include_paths) : 0,
-      m_cmd_define_options ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_cmd_define_options) : 0,
-      m_timeInfo ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::TimeInfo>>(*m_timeInfo) : 0);
+      m_macros__,
+      m_includes__,
+      m_body__,
+      m_errors__,
+      m_symbols__,
+      m_cmd_include_paths__,
+      m_cmd_define_options__,
+      m_timeInfo__);
 }
 
 inline const SURELOG::MACROCACHE::PPCache *GetPPCache(const void *buf) {
   return flatbuffers::GetRoot<SURELOG::MACROCACHE::PPCache>(buf);
 }
 
+inline const SURELOG::MACROCACHE::PPCache *GetSizePrefixedPPCache(const void *buf) {
+  return flatbuffers::GetSizePrefixedRoot<SURELOG::MACROCACHE::PPCache>(buf);
+}
+
 inline const char *PPCacheIdentifier() {
   return "SLPP";
 }
@@ -327,6 +351,11 @@
   return verifier.VerifyBuffer<SURELOG::MACROCACHE::PPCache>(PPCacheIdentifier());
 }
 
+inline bool VerifySizePrefixedPPCacheBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifySizePrefixedBuffer<SURELOG::MACROCACHE::PPCache>(PPCacheIdentifier());
+}
+
 inline const char *PPCacheExtension() {
   return "slpp";
 }
@@ -337,6 +366,12 @@
   fbb.Finish(root, PPCacheIdentifier());
 }
 
+inline void FinishSizePrefixedPPCacheBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<SURELOG::MACROCACHE::PPCache> root) {
+  fbb.FinishSizePrefixed(root, PPCacheIdentifier());
+}
+
 }  // namespace MACROCACHE
 }  // namespace SURELOG
 
diff --git a/src/Cache/python_api_generated.h b/src/Cache/python_api_generated.h
index 383084a..a52e0c3 100644
--- a/src/Cache/python_api_generated.h
+++ b/src/Cache/python_api_generated.h
@@ -14,7 +14,7 @@
 struct PythonAPICache;
 
 struct PythonAPICache FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  enum {
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_M_HEADER = 4,
     VT_M_PYTHON_SCRIPT_FILE = 6,
     VT_M_ERRORS = 8,
@@ -34,15 +34,15 @@
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_HEADER) &&
+           VerifyOffset(verifier, VT_M_HEADER) &&
            verifier.VerifyTable(m_header()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_PYTHON_SCRIPT_FILE) &&
-           verifier.Verify(m_python_script_file()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_ERRORS) &&
-           verifier.Verify(m_errors()) &&
+           VerifyOffset(verifier, VT_M_PYTHON_SCRIPT_FILE) &&
+           verifier.VerifyString(m_python_script_file()) &&
+           VerifyOffset(verifier, VT_M_ERRORS) &&
+           verifier.VerifyVector(m_errors()) &&
            verifier.VerifyVectorOfTables(m_errors()) &&
-           VerifyField<flatbuffers::uoffset_t>(verifier, VT_M_SYMBOLS) &&
-           verifier.Verify(m_symbols()) &&
+           VerifyOffset(verifier, VT_M_SYMBOLS) &&
+           verifier.VerifyVector(m_symbols()) &&
            verifier.VerifyVectorOfStrings(m_symbols()) &&
            verifier.EndTable();
   }
@@ -63,13 +63,13 @@
   void add_m_symbols(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> m_symbols) {
     fbb_.AddOffset(PythonAPICache::VT_M_SYMBOLS, m_symbols);
   }
-  PythonAPICacheBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit PythonAPICacheBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
   PythonAPICacheBuilder &operator=(const PythonAPICacheBuilder &);
   flatbuffers::Offset<PythonAPICache> Finish() {
-    const auto end = fbb_.EndTable(start_, 4);
+    const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<PythonAPICache>(end);
     return o;
   }
@@ -95,18 +95,25 @@
     const char *m_python_script_file = nullptr,
     const std::vector<flatbuffers::Offset<SURELOG::CACHE::Error>> *m_errors = nullptr,
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *m_symbols = nullptr) {
+  auto m_python_script_file__ = m_python_script_file ? _fbb.CreateString(m_python_script_file) : 0;
+  auto m_errors__ = m_errors ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::Error>>(*m_errors) : 0;
+  auto m_symbols__ = m_symbols ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_symbols) : 0;
   return SURELOG::PYTHONAPICACHE::CreatePythonAPICache(
       _fbb,
       m_header,
-      m_python_script_file ? _fbb.CreateString(m_python_script_file) : 0,
-      m_errors ? _fbb.CreateVector<flatbuffers::Offset<SURELOG::CACHE::Error>>(*m_errors) : 0,
-      m_symbols ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*m_symbols) : 0);
+      m_python_script_file__,
+      m_errors__,
+      m_symbols__);
 }
 
 inline const SURELOG::PYTHONAPICACHE::PythonAPICache *GetPythonAPICache(const void *buf) {
   return flatbuffers::GetRoot<SURELOG::PYTHONAPICACHE::PythonAPICache>(buf);
 }
 
+inline const SURELOG::PYTHONAPICACHE::PythonAPICache *GetSizePrefixedPythonAPICache(const void *buf) {
+  return flatbuffers::GetSizePrefixedRoot<SURELOG::PYTHONAPICACHE::PythonAPICache>(buf);
+}
+
 inline const char *PythonAPICacheIdentifier() {
   return "SLPY";
 }
@@ -121,6 +128,11 @@
   return verifier.VerifyBuffer<SURELOG::PYTHONAPICACHE::PythonAPICache>(PythonAPICacheIdentifier());
 }
 
+inline bool VerifySizePrefixedPythonAPICacheBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifySizePrefixedBuffer<SURELOG::PYTHONAPICACHE::PythonAPICache>(PythonAPICacheIdentifier());
+}
+
 inline const char *PythonAPICacheExtension() {
   return "slpy";
 }
@@ -131,6 +143,12 @@
   fbb.Finish(root, PythonAPICacheIdentifier());
 }
 
+inline void FinishSizePrefixedPythonAPICacheBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<SURELOG::PYTHONAPICACHE::PythonAPICache> root) {
+  fbb.FinishSizePrefixed(root, PythonAPICacheIdentifier());
+}
+
 }  // namespace PYTHONAPICACHE
 }  // namespace SURELOG
 
diff --git a/third_party/flatbuffers b/third_party/flatbuffers
new file mode 160000
index 0000000..6beb9f4
--- /dev/null
+++ b/third_party/flatbuffers
@@ -0,0 +1 @@
+Subproject commit 6beb9f49cb44095c4c17be43f13906c6eb09d7c7
