diff --git a/doc/elfio.docx b/doc/elfio.docx
index e2ecf63..8a2b473 100644
Binary files a/doc/elfio.docx and b/doc/elfio.docx differ
diff --git a/doc/elfio_converted_pdf.docx b/doc/elfio_converted_pdf.docx
new file mode 100644
index 0000000..cd7ce0d
Binary files /dev/null and b/doc/elfio_converted_pdf.docx differ
diff --git a/examples/Writer/Write.cpp b/examples/Writer/Write.cpp
index a4de555..dc627aa 100644
--- a/examples/Writer/Write.cpp
+++ b/examples/Writer/Write.cpp
@@ -1,53 +1,82 @@
-#include <ELFIO.h>
+#include <elfio.hpp>
+
+using namespace ELFIO;
 
 int main( void )
 {
-    IELFO* pELFO;
-    ELFIO::GetInstance()->CreateELFO( &pELFO );
-
+    elfio writer;
+    
     // You can't proceed without this function call!
-    pELFO->SetAttr( ELFCLASS32, ELFDATA2LSB, EV_CURRENT,
-                    ET_EXEC, EM_386, EV_CURRENT, 0 );
+    writer.create( ELFCLASS32, ELFDATA2LSB );
 
-    // Create a loadable segment
-    IELFOSegment* pSegment = pELFO->AddSegment( PT_LOAD,
-                                                0x08040000,
-                                                0x08040000,
-                                                PF_X | PF_R,
-                                                0x1000 );
+    writer.set_os_abi( ELFOSABI_LINUX );
+    writer.set_type( ET_EXEC );
+    writer.set_machine( EM_386 );
 
     // Create code section
-    IELFOSection* pTextSec = pELFO->AddSection( ".text",
-                                                SHT_PROGBITS,
-                                                SHF_ALLOC | SHF_EXECINSTR,
-                                                0,
-                                                0x10,
-                                                0 );
+    section* text_sec = writer.sections.add( ".text" );
+    text_sec->set_type( SHT_PROGBITS );
+    text_sec->set_flags( SHF_ALLOC | SHF_EXECINSTR );
+    text_sec->set_addr_align( 0x10 );
+    
     // Add data into it
-    char text[] = { '\xB8', '\x04', '\x00', '\x00', '\x00',   // mov eax, 4
-                    '\xBB', '\x01', '\x00', '\x00', '\x00',   // mov ebx, 1
-                    '\xB9', '\xFD', '\x00', '\x04', '\x08',   // mov ecx, msg
-                    '\xBA', '\x0E', '\x00', '\x00', '\x00',   // mov edx, 14
-                    '\xCD', '\x80',                           // int 0x80
-                    '\xB8', '\x01', '\x00', '\x00', '\x00',   // mov eax, 1
-                    '\xCD', '\x80',                           // int 0x80
-                    '\x48', '\x65', '\x6C', '\x6C', '\x6F',   // msg: db   'Hello, World!', 10
+    char text[] = { '\xB8', '\x04', '\x00', '\x00', '\x00',   // mov eax, 4		      
+                    '\xBB', '\x01', '\x00', '\x00', '\x00',   // mov ebx, 1		      
+                    '\xB9', '\x20', '\x80', '\x04', '\x08',   // mov ecx, msg		      
+                    '\xBA', '\x0E', '\x00', '\x00', '\x00',   // mov edx, 14		      
+                    '\xCD', '\x80',                           // int 0x80		      
+                    '\xB8', '\x01', '\x00', '\x00', '\x00',   // mov eax, 1		      
+                    '\xCD', '\x80'                            // int 0x80		      
+                  };
+    text_sec->set_data( text, sizeof( text ) );
+
+    // Create a loadable segment
+    segment* text_seg = writer.segments.add();
+    text_seg->set_type( PT_LOAD );
+    text_seg->set_virtual_address( 0x08048000 );
+    text_seg->set_physical_address( 0x08048000 );
+    text_seg->set_flags( PF_X | PF_R );
+    text_seg->set_align( 0x1000 );
+    
+    // Add code section into program segment
+    text_seg->add_section_index( text_sec->get_index(), text_sec->get_addr_align() );
+
+    // Create data section*
+    section* data_sec = writer.sections.add( ".data" );
+    data_sec->set_type( SHT_PROGBITS );
+    data_sec->set_flags( SHF_ALLOC | SHF_WRITE );
+    data_sec->set_addr_align( 0x4 );
+
+    char data[] = { '\x48', '\x65', '\x6C', '\x6C', '\x6F',   // msg: db   'Hello, World!', 10
                     '\x2C', '\x20', '\x57', '\x6F', '\x72',
                     '\x6C', '\x64', '\x21', '\x0A'
                   };
-    pTextSec->SetData( text, sizeof( text ) );
+    data_sec->set_data( data, sizeof( data ) );
+
+    // Create a read/write segment
+    segment* data_seg = writer.segments.add();
+    data_seg->set_type( PT_LOAD );
+    data_seg->set_virtual_address( 0x08048020 );
+    data_seg->set_physical_address( 0x08048020 );
+    data_seg->set_flags( PF_W | PF_R );
+    data_seg->set_align( 0x10 );
 
     // Add code section into program segment
-    pSegment->AddSection( pTextSec );
-    pTextSec->Release();
-    pSegment->Release();
+    data_seg->add_section_index( data_sec->get_index(), data_sec->get_addr_align() );
+
+    section* note_sec = writer.sections.add( ".note" );
+    note_sec->set_type( SHT_NOTE );
+    note_sec->set_addr_align( 1 );
+    note_section_accessor note_writer( writer, note_sec );
+    note_writer.add_note( 0x01, "Created by ELFIO", 0, 0 );
+    char descr[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36};
+    note_writer.add_note( 0x01, "Never easier!", descr, sizeof( descr ) );
+
+    // Setup entry point
+    writer.set_entry( 0x08048000 );
 
-    // Set program entry point
-    pELFO->SetEntry( 0x08040000 );
     // Create ELF file
-    pELFO->Save( "test.elf" );
-
-    pELFO->Release();
+    writer.save( "hello_i386_32" );
 
     return 0;
 }