diff --git a/net/FlatBuffers/IFlatbufferObject .cs b/net/FlatBuffers/IFlatbufferObject.cs
similarity index 95%
rename from net/FlatBuffers/IFlatbufferObject .cs
rename to net/FlatBuffers/IFlatbufferObject.cs
index fb6dc5b24d0c380ef46fd3419e971b73b699b39e..6a15aba6e5b6a0c0bb3b919a275d45e93e407227 100644
--- a/net/FlatBuffers/IFlatbufferObject .cs	
+++ b/net/FlatBuffers/IFlatbufferObject.cs
@@ -22,5 +22,7 @@ namespace FlatBuffers
     public interface IFlatbufferObject
     {
         void __init(int _i, ByteBuffer _bb);
+
+        ByteBuffer ByteBuffer { get; }
     }
 }
diff --git a/src/idl_gen_general.cpp b/src/idl_gen_general.cpp
index 0cbc9edc387fbabe0e25e2e5ccc38d4696441fdc..30899d4d45546726dbcc2e50fdbf5631754899c2 100644
--- a/src/idl_gen_general.cpp
+++ b/src/idl_gen_general.cpp
@@ -804,6 +804,11 @@ void GenStruct(StructDef &struct_def, std::string *code_ptr) {
     code += "  private ";
     code += struct_def.fixed ? "Struct" : "Table";
     code += " __p;\n";
+
+    if (lang_.language == IDLOptions::kCSharp) {
+        code += "  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n";
+    }
+
   } else {
     code += lang_.inheritance_marker;
     code += struct_def.fixed ? "Struct" : "Table";
diff --git a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
index efdd29a757302c1296109350290890d2b8c91c7a..6e76b07f1d33fcba08f789667b31a16d9f742d88 100644
--- a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
+++ b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
@@ -41,8 +41,8 @@
     <Compile Include="..\..\net\FlatBuffers\ByteBuffer.cs">
       <Link>FlatBuffers\ByteBuffer.cs</Link>
     </Compile>
-    <Compile Include="..\..\net\FlatBuffers\IFlatbufferObject .cs">
-      <Link>FlatBuffers\IFlatbufferObject .cs</Link>
+    <Compile Include="..\..\net\FlatBuffers\IFlatbufferObject.cs">
+      <Link>FlatBuffers\IFlatbufferObject.cs</Link>
     </Compile>
     <Compile Include="..\..\net\FlatBuffers\Offset.cs">
       <Link>FlatBuffers\Offset.cs</Link>
@@ -119,4 +119,4 @@
   <Target Name="AfterBuild">
   </Target>
   -->
-</Project>
\ No newline at end of file
+</Project>
diff --git a/tests/MyGame/Example/Monster.cs b/tests/MyGame/Example/Monster.cs
index 222fc5e79ca512dbd21e3ca9b81893b90a940c55..30f49221e187100360abf5a9f82bd9f0e49c91c3 100644
--- a/tests/MyGame/Example/Monster.cs
+++ b/tests/MyGame/Example/Monster.cs
@@ -10,6 +10,7 @@ using FlatBuffers;
 public struct Monster : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static Monster GetRootAsMonster(ByteBuffer _bb) { return GetRootAsMonster(_bb, new Monster()); }
   public static Monster GetRootAsMonster(ByteBuffer _bb, Monster obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public static bool MonsterBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "MONS"); }
diff --git a/tests/MyGame/Example/Stat.cs b/tests/MyGame/Example/Stat.cs
index b73dc16a019e1d4ac937cc0fe13a1f07849755eb..0fb5bd0f27cebbed0233d89dfa7cfd3f91438eab 100644
--- a/tests/MyGame/Example/Stat.cs
+++ b/tests/MyGame/Example/Stat.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct Stat : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static Stat GetRootAsStat(ByteBuffer _bb) { return GetRootAsStat(_bb, new Stat()); }
   public static Stat GetRootAsStat(ByteBuffer _bb, Stat obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
diff --git a/tests/MyGame/Example/Test.cs b/tests/MyGame/Example/Test.cs
index 08c669bf32d41225082ef0a114cb109f84b34bdf..92c3b912c38e90a672142c9be1ffaedff56bdf70 100644
--- a/tests/MyGame/Example/Test.cs
+++ b/tests/MyGame/Example/Test.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct Test : IFlatbufferObject
 {
   private Struct __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
   public Test __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
 
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.cs b/tests/MyGame/Example/TestSimpleTableWithEnum.cs
index 0b775ab1695d4a8903c45955bc0a81277834498b..bff386407f13bf7067d7d6c075504c4d62e48e50 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.cs
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public partial struct TestSimpleTableWithEnum : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static TestSimpleTableWithEnum GetRootAsTestSimpleTableWithEnum(ByteBuffer _bb) { return GetRootAsTestSimpleTableWithEnum(_bb, new TestSimpleTableWithEnum()); }
   public static TestSimpleTableWithEnum GetRootAsTestSimpleTableWithEnum(ByteBuffer _bb, TestSimpleTableWithEnum obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
diff --git a/tests/MyGame/Example/Vec3.cs b/tests/MyGame/Example/Vec3.cs
index 2cafbcc5a81a077f24dc6a093ab8421aa0e2f5f3..055254343f744f72283e95a9a0abacddd2574cf7 100644
--- a/tests/MyGame/Example/Vec3.cs
+++ b/tests/MyGame/Example/Vec3.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct Vec3 : IFlatbufferObject
 {
   private Struct __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
   public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
 
diff --git a/tests/MyGame/Example2/Monster.cs b/tests/MyGame/Example2/Monster.cs
index 64a5836d21aae907a1b364630e86471d90900a91..6b1602edb9cc0d4d4711095238f8077a340ae76b 100644
--- a/tests/MyGame/Example2/Monster.cs
+++ b/tests/MyGame/Example2/Monster.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct Monster : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static Monster GetRootAsMonster(ByteBuffer _bb) { return GetRootAsMonster(_bb, new Monster()); }
   public static Monster GetRootAsMonster(ByteBuffer _bb, Monster obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
diff --git a/tests/generate_code.sh b/tests/generate_code.sh
old mode 100644
new mode 100755
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs
index 81b57f4b8b0f69db4a85db1c26a943b77f86e395..508895f5818c175989b0db3efc8c9536f28d947b 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs
+++ b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct StructInNestedNS : IFlatbufferObject
 {
   private Struct __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
   public StructInNestedNS __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
 
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs
index f8a97a403ea6ad46f261f3ea6da16403e4ae5e01..a2a1c0be7f996c25ff82ca8f298317c07f7175a2 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs
+++ b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct TableInNestedNS : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static TableInNestedNS GetRootAsTableInNestedNS(ByteBuffer _bb) { return GetRootAsTableInNestedNS(_bb, new TableInNestedNS()); }
   public static TableInNestedNS GetRootAsTableInNestedNS(ByteBuffer _bb, TableInNestedNS obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
diff --git a/tests/namespace_test/NamespaceA/SecondTableInA.cs b/tests/namespace_test/NamespaceA/SecondTableInA.cs
index 32ed37b3bccc2f5fb964678872df462f0a7f4d33..2048828844c54d81f458c13bd65d06e11eb7ea7a 100644
--- a/tests/namespace_test/NamespaceA/SecondTableInA.cs
+++ b/tests/namespace_test/NamespaceA/SecondTableInA.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct SecondTableInA : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static SecondTableInA GetRootAsSecondTableInA(ByteBuffer _bb) { return GetRootAsSecondTableInA(_bb, new SecondTableInA()); }
   public static SecondTableInA GetRootAsSecondTableInA(ByteBuffer _bb, SecondTableInA obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.cs b/tests/namespace_test/NamespaceA/TableInFirstNS.cs
index 4d068a17c8436c54100c3689ef3a6ca5701fbc7d..f1c7e96b27fa44295df7b41492ed21f20ddcd4e1 100644
--- a/tests/namespace_test/NamespaceA/TableInFirstNS.cs
+++ b/tests/namespace_test/NamespaceA/TableInFirstNS.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct TableInFirstNS : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static TableInFirstNS GetRootAsTableInFirstNS(ByteBuffer _bb) { return GetRootAsTableInFirstNS(_bb, new TableInFirstNS()); }
   public static TableInFirstNS GetRootAsTableInFirstNS(ByteBuffer _bb, TableInFirstNS obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }
diff --git a/tests/namespace_test/NamespaceC/TableInC.cs b/tests/namespace_test/NamespaceC/TableInC.cs
index 2fe0fcefa022db00351a1f14e27abcc62827c54e..6dddcd4db300638ecdc07ff4218aac694876b640 100644
--- a/tests/namespace_test/NamespaceC/TableInC.cs
+++ b/tests/namespace_test/NamespaceC/TableInC.cs
@@ -9,6 +9,7 @@ using FlatBuffers;
 public struct TableInC : IFlatbufferObject
 {
   private Table __p;
+  public ByteBuffer ByteBuffer { get { return __p.bb; } }
   public static TableInC GetRootAsTableInC(ByteBuffer _bb) { return GetRootAsTableInC(_bb, new TableInC()); }
   public static TableInC GetRootAsTableInC(ByteBuffer _bb, TableInC obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
   public void __init(int _i, ByteBuffer _bb) { __p.bb_pos = _i; __p.bb = _bb; }