diff --git a/include/Field.h b/include/Field.h
index 82c10d3a9f7d62bf94445d754025f16f9463864f..4ce4f8ed00420e49533c39893293e0a6f23aa4ca 100644
--- a/include/Field.h
+++ b/include/Field.h
@@ -46,6 +46,9 @@ public:
 	
 	/// Logical type
 	enum LogicalFieldDataType type;
+
+    int sectionOffsetBits;
+    int sectionOffsetBytes;
 };
 
 
@@ -56,7 +59,7 @@ class Field
 public:
 
     /// Constructor of class.
-	Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count);
+	Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count, int sectionOffset);
 
     /// Destructor of class.
     ~Field();
@@ -100,7 +103,13 @@ public:
     };
 	
 	void print();
-	
+
+    /// Returns the offset in bytes of the field from the begin of the section.
+    /// Warning: if the field is not aligned to 8-bit this method returns -1.
+	int getSectionOffset() {
+	    return type->sectionOffsetBytes;
+	}
+
 protected:
 
 	static std::map<std::string, LogicalFieldDataType> typeStringToEnum;
@@ -110,7 +119,6 @@ protected:
     int progressiv;
 
     FieldType * type;
-
 };
 
 }
diff --git a/src/Field.cpp b/src/Field.cpp
index 5d5f0c15c0c9c7ac15c50ca7af70f82d346fcf67..360dc66d971ad3780e79e33c2090ca90a98a9984 100644
--- a/src/Field.cpp
+++ b/src/Field.cpp
@@ -62,7 +62,7 @@ std::map<std::string, LogicalFieldDataType> Field::makeMap()
 
 std::map<std::string, LogicalFieldDataType> Field::typeStringToEnum = Field::makeMap();
 
-Field::Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count)
+Field::Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count, int sectionOffset)
 	: progressiv(count)
 {
     value = 0;
@@ -93,8 +93,10 @@ Field::Field(std::string name, std::string typeStr, std::string dim, std::string
         type->name = name;
 		type->dimension = atoi(dim.c_str());
 		type->type = Field::typeStringToEnum[typeStr];
+		type->sectionOffsetBits = sectionOffset;
+        type->sectionOffsetBytes = (sectionOffset % 8) ? -1 : sectionOffset / 8;
 #ifdef DEBUG
-		std::cout << "Adding field '" << name << "', " << type->dimension << " bits type " << typeStr << " (" << type->type << ")" << std::endl;
+		std::cout << "Adding field '" << name << "', " << type->dimension << " bits type " << typeStr << " (" << type->type << ")" << " section offset " << type->sectionOffsetBits << " " << type->sectionOffsetBytes << std::endl;
 #endif
 
         if(prVal.compare("none") != 0)
diff --git a/src/PartOfPacket.cpp b/src/PartOfPacket.cpp
index b920659cafc75d1af9c35bd3f14a43bf8862cab0..ef09237d7f5531801c2d09c34ce1b7c4a6f10a01 100644
--- a/src/PartOfPacket.cpp
+++ b/src/PartOfPacket.cpp
@@ -125,6 +125,7 @@ void PartOfPacket::loadFields(pugi::xml_node node)
     fields = new Field*[count];
 
 	// field parsing
+    int sectionOffset = 0;
 	for(pugi::xml_node_iterator it=node.begin(); it != node.end(); ++it)
 	{
 		if(string(it->name()).compare("field") != 0)
@@ -143,19 +144,21 @@ void PartOfPacket::loadFields(pugi::xml_node node)
 				name = it->attribute("name").value();
 				dimension = "16";
 				value = "none";
-				Field* f = new Field(name, typeStr, dimension, value, numberOfFields);
+				Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
 				fieldsDimension += f->size();
 				fields[numberOfFields] = f;
 				numberOfFields++;
+				sectionOffset += 16;
 
 				name = it->attribute("name").value();
 				name += "__1";
 				dimension = "16";
 				value = "none";
-				f = new Field(name, typeStr, dimension, value, numberOfFields);
+				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
 				fieldsDimension += f->size();
 				fields[numberOfFields] = f;
 				numberOfFields++;
+				sectionOffset += 16;
 
 				found = true;
 				break;
@@ -172,37 +175,41 @@ void PartOfPacket::loadFields(pugi::xml_node node)
 				name = it->attribute("name").value();
 				dimension = "16";
 				value = "none";
-				Field* f = new Field(name, typeStr, dimension, value, numberOfFields);
+				Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
 				fieldsDimension += f->size();
 				fields[numberOfFields] = f;
 				numberOfFields++;
+				sectionOffset += 16;
 
 				name = it->attribute("name").value();
 				name += "__1";
 				dimension = "16";
 				value = "none";
-				f = new Field(name, typeStr, dimension, value, numberOfFields);
+				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
 				fieldsDimension += f->size();
 				fields[numberOfFields] = f;
 				numberOfFields++;
+				sectionOffset += 16;
 
 				name = it->attribute("name").value();
 				name += "__2";
 				dimension = "16";
 				value = "none";
-				f = new Field(name, typeStr, dimension, value, numberOfFields);
+				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
 				fieldsDimension += f->size();
 				fields[numberOfFields] = f;
 				numberOfFields++;
+				sectionOffset += 16;
 
 				name = it->attribute("name").value();
 				name += "__3";
 				dimension = "16";
 				value = "none";
-				f = new Field(name, typeStr, dimension, value, numberOfFields);
+				f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
 				fieldsDimension += f->size();
 				fields[numberOfFields] = f;
 				numberOfFields++;
+				sectionOffset += 16;
 
 				found = true;
 				break;
@@ -221,10 +228,11 @@ void PartOfPacket::loadFields(pugi::xml_node node)
 			value = "none";
 		else
 			value = constvalue.value();
-		Field* f = new Field(name, typeStr, dimension, value, numberOfFields);
+		Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
 		fieldsDimension += f->size();
 		fields[numberOfFields] = f;
 		numberOfFields++;
+		sectionOffset += atoi(dimension.c_str());
 	}
 }
 
@@ -259,7 +267,7 @@ bool PartOfPacket::loadFields(InputText& fp) throw(PacketException*)
 
         dimension = fp.getLine();
         value = fp.getLine();
-        Field* f = new Field(name, "", dimension, value, numberOfFields);
+        Field* f = new Field(name, "", dimension, value, numberOfFields, -1);
         fieldsDimension += f->size();
         fields[numberOfFields] = f;
         numberOfFields++;
@@ -298,7 +306,7 @@ bool PartOfPacket::loadFields(MemoryBuffer* buffer) throw(PacketException*)
     {
         dimension = buffer->getbuffer();
         value = buffer->getbuffer();
-        Field* f = new Field(name, "", dimension, value, numberOfFields);
+        Field* f = new Field(name, "", dimension, value, numberOfFields, -1);
         fieldsDimension += f->size();
         fields[numberOfFields] = f;
         numberOfFields++;