diff --git a/ChangeLog b/ChangeLog
index 3357d9665a1badf71a817f3c98457f672d67b5bd..56c707437a5cdace9198bf9becd14dbc6486250a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2014-03-09 Andrea Bulgarelli <bulgarelli@iasfbo.inaf.it>
++ size() instead of getDimension
++ sizeMax()
++ removed decodeTupe
++ Packet::verify()
++ Packet::set()
+
+
+
 2014-03-09 Andrea Bulgarelli <bulgarelli@iasfbo.inaf.it>
 TAG v4.0.0
 + moved InputPacketStream::getPacket() to PacketStream
diff --git a/include/ByteStream.h b/include/ByteStream.h
index 64a7b7ba846e1b87a7fd069ffb05c4b9f0059ef9..68745c9dbada1959dc09f59593c8b7416a055838 100644
--- a/include/ByteStream.h
+++ b/include/ByteStream.h
@@ -100,7 +100,7 @@ public:
     long getValue(dword start, word dim);
 
     /// Gets the dimension of the stream
-    dword getDimension();
+    dword size();
 
     char* printStreamInHexadecimal();
 
diff --git a/include/Field.h b/include/Field.h
index b793ff02a40b4ecf722b80526d37ba753b7b6795..f7394a6e73604125301fb977fea9d39afb2536ca 100644
--- a/include/Field.h
+++ b/include/Field.h
@@ -59,7 +59,7 @@ public:
     word value;
 
     /// Dimension of field in bit.
-    inline dword getDimension()
+    inline dword size()
     {
         return type->dimension;
     };
diff --git a/include/InputPacketStream.h b/include/InputPacketStream.h
index bbdb711144bda2c9e481bed437e60d9bd448d288..334f68842e59d1bf78a3a69ae8ae2579c22dfc74 100644
--- a/include/InputPacketStream.h
+++ b/include/InputPacketStream.h
@@ -44,7 +44,7 @@ public:
     /// \pre The setInput method must be invocated
     /// \param bDecode if true decode the method will decode the data fields.
     /// \return A pointer telemetry packet. Make attention: the object returned is one of the TM packet object of the array of this object. Don't delete it!
-    Packet* readPacket(int decodeType = 2) throw(PacketExceptionIO*);
+    Packet* readPacket() throw(PacketExceptionIO*);
 
 
 
diff --git a/include/Packet.h b/include/Packet.h
index 005128f0205a18d37bc14feb8e13b1ad12932584..3b69d17dcbc6f4cd74d8f90b45b1a8d7bbad670f 100644
--- a/include/Packet.h
+++ b/include/Packet.h
@@ -30,6 +30,15 @@
 #include "PacketExceptionIO.h"
 #include "PacketExceptionFileFormat.h"
 
+//Packet::size()
+//stream = prefix + packet
+//Packet::set(ByteStreamPtr stream)
+//Packet::set(ByteStreamPtr prefix, ByteStream packet)
+//Packet::set(ByteStreamPtr prefix, ByteStreamPtr header, ByteStreamPtr dataField)
+//check if the stream
+//bool Packet::verify()
+//char** Packet::printFields()
+//char* Packet::printStream();
 
 namespace PacketLib
 {
@@ -46,61 +55,29 @@ public:
     virtual ~Packet();
 
     virtual bool createPacketType(char* fileName, bool prefix, word dimprefix) throw (PacketException*);
-
-    /// This method verifies if the ByteStream on argument contains the correct value
-    /// in the identifiers. If this is true, the method return true and the stream
-    /// contains a packet of this type. This method overloads another method.
-	/// \post the bytestream is decoded
-    virtual bool setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
-
-    /// This method verifies if the ByteStream on argument contains the correct value
-    /// in the identifiers. If this is true, the method returns true and the stream
-    /// contains a packet of this type. This method overloads another method.
-    /// \post the bytestream is decoded
-    virtual bool setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet);
-
-    /// Sets all the fields of the packet with correct value contained into the input ByteStream.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet
-    /// \param packetHeader This is the header of the packet
-    /// \param packetDataField This is the data field of the packet
-	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    /// \post the bytestream is decoded
-    virtual bool setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, int decodeType);
-
-    /// Sets all the fields of the packet with correct value contained into the input ByteStream.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet
-    /// \param packet This is the packet
-	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    /// \post the bytestream is decoded
-    virtual bool setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet, int decodeType);
-
-    /// Verifies if within the ByteStream passed with arguments it's present a correct packet.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet
-    /// \param packet This is the packet
-    /// \return True if the ByteStream contains a packet
-    virtual bool verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet);
-
-    /// Verifies if within the byte* stream passed with arguments it's present a correct packet. The stream* contains also the prefix (if present)
-    /// \param stream A pointer to the stream of byte, with prefix and packet
-    virtual bool verifyPacketValue(byte* stream);
-
-    /// Sets all the fields of the packet with correct value contained into the input ByteStream.
+	
+	/// Sets the ByteStream.
     /// \param stream A pointer to the stream of byte, with prefix and packet
-	/// \param decode only the sections
-	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    virtual bool setPacketValue(ByteStreamPtr stream, int decodeType);
-
-    /// Verifies if within the ByteStream passed with arguments it's present a correct packet.
-    ///	\pre The structure of the stream must be loaded.
-    /// \param prefix This is the prefix of the packet.
-    /// \param packetHeader This is the header of the packet.
-    /// \param packetDataField This is the data field of the packet.
-    /// \return True if the ByteStream contains a packet.
-    virtual bool verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
+	/// \param checkPacketLenght if true check the packet lenght and set the packet stream, if false do not check the packet lenght
+    virtual bool set(ByteStreamPtr stream, bool checkPacketLenght = false);
+	
+	/// Sets the ByteStream.
+    /// \param prefix A pointer to the stream of byte, with the prefix
+	/// \param packet A pointer to the stream of byte, with the packet
+	/// \param checkPacketLenght if true check the packet lenght and set the packet stream, if false do not check the packet lenght
+    virtual bool set(ByteStreamPtr prefix, ByteStreamPtr packet, bool checkPacketLenght = false);
+	
+	/// Sets the ByteStream.
+    /// \param prefix A pointer to the stream of byte, with the prefix
+	/// \param packetHeader A pointer to the stream of byte, with the packet header
+	/// \param packetHeader A pointer to the stream of byte, with the packet data field
+	/// \param checkPacketLenght if true check the packet lenght and set the packet stream, if false do not check the packet lenght
+    virtual bool set(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, bool checkPacketLenght = false);
 	
+	///return true is the packet contained into the stream is recognized using identifiers.
+	///\pre the ByteStream is set with one of set(ByteStream) methods
+	virtual bool verify();
+		
 	///Get the prefix as a ByteStream
 	ByteStreamPtr getBSPrefix();
 	
@@ -168,19 +145,19 @@ public:
     virtual  char* printPacketOutputStream();
 
     /// Gets the dimension in byte of the current packet (header + datafield (data field header + sdf + tail)
-    dword getDimension();
+    dword size();
 
 	/// Get dimension in bytes of the fixed part (without tail) = dim(header) + dim(data field header) + dim(source data field fixed)
-	inline dword getDimensionFixedPart() { return dimPacketStartingFixedPart; };
+	inline dword sizeFixedPart() { return dimPacketStartingFixedPart; };
     
 	/// Get dimension of the prefix
-	inline dword getDimensionPrefix() { return dimPrefix; };
+	inline dword sizePrefix() { return dimPrefix; };
 	
 	/// Get dimension of the tail
-    inline dword getDimensionTail() { return dimPacketTail; };
+    inline dword sizeTail() { return dimPacketTail; };
 	
     /// Gets the max dimension in byte of the packet.
-    dword getMaxDimension();
+    dword sizeMax();
 
     
     /// Gets the ByteStream received as input
@@ -228,6 +205,16 @@ public:
     ByteStreamPtr packet_output;
 	
 protected:
+	
+	/// Sets all the fields of the packet with correct value contained into the input ByteStream.
+    ///	\pre The structure of the stream must be loaded.
+    /// \param prefix This is the prefix of the packet
+    /// \param packetHeader This is the header of the packet
+    /// \param packetDataField This is the data field of the packet
+	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
+    /// \post the bytestream is decoded
+    virtual bool setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, int decodeType);
+
     
     /// This attribute represents the packet header.
     PacketHeader *header;
@@ -244,12 +231,12 @@ protected:
     /// The ByteStrem of the packet read
     ByteStreamPtr packet;
 	
+	/// The ByteStrem of the packet read
+    ByteStreamPtr stream;
 	
-	/// Set the internal prefix and packet.
-	virtual void setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
 	
-	/// Set the internal prefix and packet.
-	virtual void setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packet);
+	void setByteStreamSections();
+
     
     /// Generates the stream for output.
     /// \pre the number of block and the number of element for each block
@@ -288,10 +275,6 @@ protected:
 
     bool setPacketValueTail(ByteStreamPtr packetDataField);
 
-    void memByteStream(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField);
-
-    void memByteStream(ByteStreamPtr prefix, ByteStreamPtr packet);
-
     bool bigendian;
 
     bool thereisprefix;
@@ -326,6 +309,14 @@ private:
 	
 	///dimPacketHeader + dimPacketDataFieldHeader + dimPacketSourceDataFieldFixed
 	dword dimPacketStartingFixedPart;
+	
+	bool decodedPacketHeader;
+	
+	bool decodedPacketDataFieldHeader;
+	
+	bool decodedPacketSourceDataField;
+	
+	bool decodedPacketTail;
 
 };
 
diff --git a/include/PacketDataField.h b/include/PacketDataField.h
index 02fdabdf4fc23877dbfdf3867d7250ff9801c4e3..e5067066a24f93f98b33596722530f881d636cef 100644
--- a/include/PacketDataField.h
+++ b/include/PacketDataField.h
@@ -38,10 +38,10 @@ public:
     ~PacketDataField();
 
     /// Total dimension in bytes of data field.
-    dword getDimension();
+    dword size();
 
     /// Total max dimension in bytes of data field.
-    dword getMaxDimension();
+    dword sizeMax();
 
     /// Creates the outputstream ByteStream for the generation of the output stream
     virtual bool setOutputStream(ByteStreamPtr os, word first);
diff --git a/include/PacketHeader.h b/include/PacketHeader.h
index 2e2177a47e531fc1e06b30858b7dd23d5b319f82..ba84c491cfb8878e32c2346e54ff57499eea3e4b 100644
--- a/include/PacketHeader.h
+++ b/include/PacketHeader.h
@@ -50,7 +50,7 @@ public:
 
     Field * getFieldWithPacketDimension();
 
-    inline word getDimensionOfPacketLength()
+    inline word sizeOfPacketLength()
     {
         return dimensionOfPacketLength;
     };
diff --git a/include/PacketStream.h b/include/PacketStream.h
index ede3294e3e4401060c77792aab24155878d0642e..c277540deb13fa44393f4cb8d93d4478961afe23 100644
--- a/include/PacketStream.h
+++ b/include/PacketStream.h
@@ -41,7 +41,7 @@ public:
 	/// \pre the prefix has been removed
 	/// \param packet the stream that contains the source packet without the prefix
 	/// \param decodeType (0) do not decode anything (1) decode only sections (prefix, header, data field header, source data field fixed part, source data field variable part) (2) decode blocks (all sections + all blocks of the ‘source data field variable part’)
-    Packet* getPacket(ByteStreamPtr packet, int decodeType = 2) throw(PacketException*);
+    Packet* getPacket(ByteStreamPtr stream) throw(PacketException*);
 	
 	/// \return The index of packet type if it's recognized. 0 if packet isn't recognized.
     /// \param prefix A ByteStream that contains the prefix of packet (if present).
diff --git a/include/PartOfPacket.h b/include/PartOfPacket.h
index fcd7616e7204beb7dfc70aa4286c7c18570c702e..2d94a6b4639bcffbbe6883f6231474504fdcfdc8 100644
--- a/include/PartOfPacket.h
+++ b/include/PartOfPacket.h
@@ -65,7 +65,7 @@ public:
     virtual MemoryBuffer* loadFieldsInBuffer(InputText & fp);
 
     /// Returns the dimension (in byte) of this part of packet.
-    virtual  inline dword getDimension()
+    virtual  inline dword size()
     {
         return fieldsDimension / 8;
     };
diff --git a/include/SDFBlock.h b/include/SDFBlock.h
index cdffda899532d47cc6b9df2c1ef21185ebde2ae7..a3af3294b681baaf38f8c519576d93eddc1e9403 100644
--- a/include/SDFBlock.h
+++ b/include/SDFBlock.h
@@ -111,9 +111,9 @@ public:
     /// \param rBlockIndex the number of the rblock
     virtual SDFBlock* getBlock(word nblock, word rBlockIndex);
 
-    virtual dword getMaxDimension();
+    virtual dword sizeMax();
 
-    virtual dword getDimension();
+    virtual dword size();
 
     /// Set the number of blocks (the number of times that a block of a
     /// determinated type is repeated) for each type of rblock present.
diff --git a/include/SourceDataField.h b/include/SourceDataField.h
index 9e41cb1116581d27db19da886b4dfa890097e708..c3ceaa839872e8f37b1627ec98b180318c38f027 100644
--- a/include/SourceDataField.h
+++ b/include/SourceDataField.h
@@ -68,11 +68,11 @@ public:
     /// Returns the number of fields.
     virtual word getNumberOfFields();
 
-    virtual dword getMaxDimension();
+    virtual dword sizeMax();
 
-    virtual dword getDimension();
+    virtual dword size();
 	
-	virtual dword getDimensionFixedPart();
+	virtual dword sizeFixedPart();
 
 	//onlySections = false
     virtual bool setByteStream(ByteStreamPtr s, int decodeType);
diff --git a/src/ByteStream.cpp b/src/ByteStream.cpp
index e62403600e632032fbc21f753b7d598837677fc9..c8f656e4be6b11705af195e773a44c7d03c4c78d 100644
--- a/src/ByteStream.cpp
+++ b/src/ByteStream.cpp
@@ -71,7 +71,7 @@ PacketLib::ByteStream::ByteStream(ByteStreamPtr b0, dword start, dword end, bool
 	mem_allocation_constructor = true;
 	
 	if(end == -1)
-		end = b0->getDimension();
+		end = b0->size();
 	
 	byteInTheStream = end-start;
     this->stream = b0->stream+start;
@@ -100,24 +100,24 @@ PacketLib::ByteStream::ByteStream(ByteStreamPtr b0, ByteStreamPtr b1, ByteStream
         mem_allocation_constructor = false;
         return;
     }
-    byteInTheStream = (b0!=0?b0->getDimension():0) + (b1!=0?b1->getDimension():0) + (b2!=0?b2->getDimension():0);
+    byteInTheStream = (b0!=0?b0->size():0) + (b1!=0?b1->size():0) + (b2!=0?b2->size():0);
     stream = (byte*) new byte[byteInTheStream];
     this->bigendian = (b0!=0?b0->isBigendian():(b1!=0?b1->isBigendian():(b2!=0?b2->isBigendian():false)));
 
 	if(b0 != 0)
 	{
-		memcpy(stream, b0->stream, b0->getDimension());
-		dim += b0->getDimension();
+		memcpy(stream, b0->stream, b0->size());
+		dim += b0->size();
 	}
 	if(b1 != 0)
 	{
-		memcpy(stream+dim, b1->stream, b1->getDimension());
-		dim += b1->getDimension();
+		memcpy(stream+dim, b1->stream, b1->size());
+		dim += b1->size();
 	}
 	if(b2 != 0)
 	{
-		memcpy(stream+dim, b2->stream, b2->getDimension());
-		dim += b2->getDimension();
+		memcpy(stream+dim, b2->stream, b2->size());
+		dim += b2->size();
 	}
     setMemoryAllocated(true);
     mem_allocation_constructor = false;
@@ -240,7 +240,7 @@ void PacketLib::ByteStream::endOutputStream()
 }
 
 
-dword PacketLib::ByteStream::getDimension()
+dword PacketLib::ByteStream::size()
 {
     return byteInTheStream;
 }
@@ -286,7 +286,7 @@ bool PacketLib::ByteStream::setStream(ByteStreamPtr b, dword first, dword last)
 {
     if(first > last)
         return false;
-    if(last > b->getDimension())
+    if(last > b->size())
         return false;
 
     deleteStreamMemory();
diff --git a/src/File.cpp b/src/File.cpp
index 3e896cdc2cf382d480f73674c37dd5e1a2422e40..ded8fcbdbc56c22d511ecd6312ffe44f658f9508 100644
--- a/src/File.cpp
+++ b/src/File.cpp
@@ -306,7 +306,7 @@ bool File::writeString(const char* str) throw(PacketExceptionIO*)
 bool File::writeByteStream(ByteStreamPtr b) throw(PacketExceptionIO*)
 {
     byte* stream = b->getOutputStream();
-    if(fwrite((void*)stream, b->getDimension(), 1, fp)<1)
+    if(fwrite((void*)stream, b->size(), 1, fp)<1)
         throw new PacketExceptionIO("Can't write stream in the file.");
     b->endOutputStream();
     return true;
diff --git a/src/InputFile.cpp b/src/InputFile.cpp
index ab498938e1eca24ddd25d5ffd2fce511af54ffb2..bb577671311c5f16f1a92f4cf3e0d04d25ee9bf4 100644
--- a/src/InputFile.cpp
+++ b/src/InputFile.cpp
@@ -58,7 +58,7 @@ ByteStreamPtr InputFile::readByteStream(dword n_byte) throw(PacketExceptionIO*)
         return 0;
     closed = file->isClosed();
     eof = file->isEOF();
-    if(bs->getDimension() == 0) return 0;
+    if(bs->size() == 0) return 0;
     return bs;
 }
 
diff --git a/src/InputPacketStream.cpp b/src/InputPacketStream.cpp
index f2dc51946f1813fe9c998cf200e0660c4793937e..c01c4e13601aabb12a4c1fe825888ce5cb7bf8c0 100644
--- a/src/InputPacketStream.cpp
+++ b/src/InputPacketStream.cpp
@@ -48,7 +48,7 @@ void InputPacketStream::setInput(Input* in)
 
 
 
-Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
+Packet* InputPacketStream::readPacket() throw(PacketExceptionIO*)
 {
     unsigned dimHeader = getHeaderDimension();
     unsigned dimPrefix = getPrefixDimension();
@@ -74,9 +74,9 @@ Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
             else
                 return 0;
         }
-        if(b1->getDimension() != dimHeader)
+        if(b1->size() != dimHeader)
         {
-            if(b1->getDimension() != 0)
+            if(b1->size() != 0)
                 pindex = 0;
             else
                 throw new PacketExceptionIO("it is impossible to read the full header.");
@@ -93,7 +93,7 @@ Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
                 else
                     return 0;
             }
-            dim= b2->getDimension();
+            dim= b2->size();
             if(dim != pl)
             {
                 if(dim != 0)
@@ -108,7 +108,7 @@ Packet* InputPacketStream::readPacket(int decodeType) throw(PacketExceptionIO*)
 		Packet* p = packetType[pindex];
 
 
-		if(!p->setPacketValue(b0, b1, b2, decodeType)) //gli stream diventano del packet
+		if(!p->set(b0, b1, b2)) //gli stream diventano del packet
 			throw new PacketExceptionIO("it is impossible to resolve the packet.");
 
 		return p;
diff --git a/src/InputPacketStreamFile.cpp b/src/InputPacketStreamFile.cpp
index 996b754324ee93728ee572a1eb20cd7fb749fce8..54e4949163fb157a827a07ed099cdbf4ac8397e5 100644
--- a/src/InputPacketStreamFile.cpp
+++ b/src/InputPacketStreamFile.cpp
@@ -103,7 +103,7 @@ bool InputPacketStreamFile::freeRun() throw(PacketExceptionIO*)
     numberOfFileStreamPointer = 0;
     inputStream->setFirstPos();
     long count = 0;
-    unsigned dimHeader = headerReference->getDimension();
+    unsigned dimHeader = headerReference->size();
     while(!inputStream->isEOF())
     {
         int pindex = 0;
@@ -113,9 +113,9 @@ bool InputPacketStreamFile::freeRun() throw(PacketExceptionIO*)
             return true;
 
         b1 = inputStream->readHeader(dimHeader);
-        if(b1->getDimension() != dimHeader)
+        if(b1->size() != dimHeader)
         {
-            if(b1->getDimension() != 0)
+            if(b1->size() != 0)
                 pindex = 0;
             else
             {
@@ -128,7 +128,7 @@ bool InputPacketStreamFile::freeRun() throw(PacketExceptionIO*)
             headerReference->setByteStream(b1);
             pl = headerReference->getPacketLength();
             b2 = inputStream->readDataField(pl);
-            dim= b2->getDimension();
+            dim= b2->size();
             if(dim != pl)
             {
                 if(dim != 0)
@@ -190,7 +190,7 @@ Packet* InputPacketStreamFile::getPacketFromFileStreamPointer(int index, bool ne
     type = it->typeOfPacket;
     pos = it->pointerStart;
     inputStream->setpos(pos);
-    int dimHeader = headerReference->getDimension();
+    int dimHeader = headerReference->size();
     b0 = inputStream->readPrefix();
     if((b1 = inputStream->readHeader(dimHeader)) == NULL)
         return NULL;
@@ -211,7 +211,7 @@ Packet* InputPacketStreamFile::getPacketFromFileStreamPointer(int index, bool ne
         pnew->createPacketType((char*)sf.c_str(), prefix, dimPrefix);
         p = pnew;
     }
-    if(p->setPacketValue(b0, b1, b2, 2))
+    if(p->set(b0, b1, b2))
         return p;
     else
         return NULL;
@@ -267,7 +267,7 @@ Packet* InputPacketStreamFile::getPacketFromStream() throw (PacketExceptionIO *
 {
     ByteStreamPtr b0, b1, b2;
     word pl, dim;
-    unsigned dimHeader = headerReference->getDimension();
+    unsigned dimHeader = headerReference->size();
 
     if(inputStream->isEOF())
         return 0;
@@ -275,13 +275,13 @@ Packet* InputPacketStreamFile::getPacketFromStream() throw (PacketExceptionIO *
     if(inputStream->isEOF())
         return 0;
     b1 = inputStream->readHeader(dimHeader);
-    if(b1->getDimension() != dimHeader)
+    if(b1->size() != dimHeader)
         return 0;
 
     headerReference->setByteStream(b1);
     pl = headerReference->getPacketLength();
     b2 = inputStream->readDataField(pl);
-    dim = b2->getDimension();
+    dim = b2->size();
     if(dim != pl)
         return 0;
 
@@ -289,7 +289,8 @@ Packet* InputPacketStreamFile::getPacketFromStream() throw (PacketExceptionIO *
     for (int i = 1; i<numberOfPacketType; i++)
     {
         p = getPacketType(i);
-        if(p->setAndVerifyPacketValue(b0, b1, b2))
+		p->set(b0, b1, b2);
+        if(p->verify())
         {
             return p;
         }
diff --git a/src/InputSerial.cpp b/src/InputSerial.cpp
index 90f5d7536ce0a5dce4fd9df9dc781ca7a03275c5..5650d720271ff8aa35778ad7238eff5889828191 100644
--- a/src/InputSerial.cpp
+++ b/src/InputSerial.cpp
@@ -84,7 +84,7 @@ ByteStreamPtr InputSerial::readByteStream(int n_byte) throw(PacketExceptionIO*)
     //for(int i=0; i<n_byte; i++)
     //printf("%d: %x\n", i, buff[i]);
 
-    if(bs->getDimension() == 0)
+    if(bs->size() == 0)
         return 0;
     return bs;
 }
diff --git a/src/OutputSerial.cpp b/src/OutputSerial.cpp
index 24039360c41eef08b3329d7b90695abc93b805f6..c594ff26c4f91f2f6f7daeb01607178b360ef72f 100644
--- a/src/OutputSerial.cpp
+++ b/src/OutputSerial.cpp
@@ -56,7 +56,7 @@ bool OutputSerial::open(char** parameters) throw(PacketExceptionIO*)
 bool OutputSerial::writeByteStream(ByteStreamPtr b) throw(PacketExceptionIO*)
 {
     byte* buff = b->getStream();
-    unsigned n_byte = b->getDimension();
+    unsigned n_byte = b->size();
 
     if(!isclosed)
         if( serial->write( buff, n_byte ) > 0 )
diff --git a/src/Packet.cpp b/src/Packet.cpp
index 01d7b524a832d557b2febc13c27dd18c99fc0e4e..5dc98bcf82bfa018c8df5391732de3d2ba67427c 100644
--- a/src/Packet.cpp
+++ b/src/Packet.cpp
@@ -21,6 +21,7 @@
 
 using namespace PacketLib;
 
+#define DECODETYPE 2
 
 Packet::Packet(bool bigendian)
 {
@@ -87,7 +88,7 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                 if(header->loadHeader(line))
                 {
                     /// delete[] line;
-					dimPacketHeader = header->getDimension();
+					dimPacketHeader = header->size();
                     /// find the DataFieldHeader section
                     line=file.getLine("[DataFieldHeader]");
                     if(strlen(line) != 0)
@@ -96,7 +97,7 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                         /// section found
                         if(dataField->getPacketDataFieldHeader()->loadFields(file))
                         {
-							dimPacketDataFieldHeader = dataField->getPacketDataFieldHeader()->getDimension();
+							dimPacketDataFieldHeader = dataField->getPacketDataFieldHeader()->size();
                             //cout << (dataField->dataFieldHeader->printStructure())->c_str();
                             line=file.getLastLineRead();
                             char *typeOfPacket = 0;
@@ -116,7 +117,7 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                                 if(dataField->getPacketSourceDataField()->loadFields(file))
                                 {
                                     //cout << (dataField->sourceDataField->printStructure())->c_str();
-									dimPacketSourceDataFieldFixed = dataField->getPacketSourceDataField()->getDimensionFixedPart();
+									dimPacketSourceDataFieldFixed = dataField->getPacketSourceDataField()->sizeFixedPart();
 									dimPacketStartingFixedPart = dimPacketHeader + dimPacketDataFieldHeader + dimPacketSourceDataFieldFixed;
 									
                                     line=file.getLastLineRead();
@@ -135,13 +136,21 @@ bool Packet::createPacketType(char* fileName, bool isprefix, word dimprefix) thr
                                                     throw new PacketExceptionFileFormat("Error in [Tail] section");
                                                 } else
 												{
-													dimPacketTail = dataField->getPacketTail()->getDimension();
+													dimPacketTail = dataField->getPacketTail()->size();
+													line = file.getLastLineRead();
+													if(strcmp(line, "[Algorithms]") == 0) {
+														//select CRC algorithm
+														char *crcAlg = file.getLine();
+														//select compression algorithm
+														char *compressionAlgo = file.getLine();
+														//TODO
+													}
 												}
                                             }
                                             //TODO: chiudere il file anche negli altri casi
                                             file.close();
                                             /// Memory allocation for the output stream
-                                            dword dimpo = getMaxDimension();
+                                            dword dimpo = sizeMax();
                                             dword dimpr = (isprefix?dimprefix:0);
                                             packet_output = ByteStreamPtr(new ByteStream(dimpo + dimpr, bigendian));
 
@@ -268,27 +277,16 @@ void Packet::printIdentifiers()
     }
 }
 
-void Packet::setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
-{
-    memByteStream(prefix, packetHeader, packetDataField);
-    ByteStreamPtr packet = ByteStreamPtr(new ByteStream(packetHeader, packetDataField, 0));
-    memByteStream(prefix, packet);
-}
 
-void Packet::setByteStreamPointers(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    memByteStream(prefix, packet);
-}
+
 
 bool Packet::setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, int decodeType)
 {
 
-	setByteStreamPointers(prefix, packetHeader, packetDataField);
-
 	if(decodeType == 0)
 		return true;
 	
-    //cout << "@ " << packetDataField->getDimension() << endl;
+    //cout << "@ " << packetDataField->size() << endl;
     /// 1)
     if(!setPacketValueVerify(prefix, packetHeader, packetDataField))
     {
@@ -331,43 +329,22 @@ bool Packet::setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, By
 
 
 
-bool Packet::setPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet, int decodeType)
-{
-    dword dimHeader = header->getDimension();
-    memByteStream(prefix, packet);
-    tempHeader->setStream(packet, 0, dimHeader-1);
-    tempDataField->setStream(packet, dimHeader, packet->getDimension());
-    return setPacketValue(prefix, tempHeader, tempDataField, decodeType);
-}
-
-
-
-bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    dword dimHeader = header->getDimension();
-    memByteStream(prefix, packet);
-    tempHeader->setStream(packet, 0, dimHeader-1);
-    tempDataField->setStream(packet, dimHeader, packet->getDimension());
-    return verifyPacketValue(prefix, tempHeader, tempDataField);
-}
-
-
-
-bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
+bool Packet::verify()
 {
     bool verified = true;
-    memByteStream(prefix, packetHeader, packetDataField);
+	
+	ByteStreamPtr packetHeader = header->getByteStream();
+	ByteStreamPtr packetDataField = dataField->getByteStream();
+    
     if(type_of_identifier[2] == true)
     {
-        if(!setPacketValue(prefix, packetHeader, packetDataField, 2))
+        if(!setPacketValue(prefix, packetHeader, packetDataField, DECODETYPE))
         {
             return false;
         }
     }
     else
     {
-        if(!setPacketValueVerify(prefix, packetHeader, packetDataField))
-            return false;
         if(type_of_identifier[1] == true)
         {
             if(!setPacketValueDataFieldHeader(packetDataField))
@@ -376,30 +353,30 @@ bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader,
         if(type_of_identifier[0] == true)
             if(!setPacketValueHeader(packetHeader))
                 return false;
-
+		
         if(!setPacketValuePrefix(prefix))
             return false;
-
-
+		
+		
     }
     ///  Iterate through list and verify each element.
-
+	
     for(unsigned i = 0; i< number_of_identifier; i++)
     {
         PacketIdentifier* pi = identifiers[i];
         Field* f = NULL;
         switch(pi->type)
         {
-        case 0:
-            f = header->getFields(pi->fieldNumber);
-            break;
-        case 1:
-            f = dataField->getPacketDataFieldHeader()->getFields(pi->fieldNumber);
-            break;
-        case 2:
-
-            f = dataField->getPacketSourceDataField()->getFields(pi->fieldNumber);
-            break;
+			case 0:
+				f = header->getFields(pi->fieldNumber);
+				break;
+			case 1:
+				f = dataField->getPacketDataFieldHeader()->getFields(pi->fieldNumber);
+				break;
+			case 2:
+				
+				f = dataField->getPacketSourceDataField()->getFields(pi->fieldNumber);
+				break;
         }
         if(f == NULL || f->value != pi->value)
         {
@@ -407,72 +384,7 @@ bool Packet::verifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader,
             break;
         }
     }
-    if(verified==false)
-        return false;
-    else
-        return true;
-}
-
-
-bool Packet::setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    dword dimHeader = header->getDimension();
-    memByteStream(prefix, packet);
-    tempHeader->setStream(packet, 0, dimHeader-1);
-    tempDataField->setStream(packet, dimHeader, packet->getDimension());
-    return setAndVerifyPacketValue(prefix, tempHeader, tempDataField);
-}
-
-
-bool Packet::setAndVerifyPacketValue(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
-{
-    memByteStream(prefix, packetHeader, packetDataField);
-    ByteStreamPtr packet = ByteStreamPtr(new ByteStream(packetHeader, packetDataField, 0));
-    memByteStream(prefix, packet);
-    if(verifyPacketValue(prefix, packetHeader, packetDataField)==false)
-    {
-        PRINTERROR("Error in verify packet value");
-        return false;
-    }
-    // se arrivo qui, allora devo settare il resto
-    if(type_of_identifier[2] == false)
-    {
-
-        if(type_of_identifier[0] == false)
-        {
-            if(!setPacketValueHeader(packetHeader))
-            {
-                PRINTERROR("Error in set packet value header");
-                return false;
-            }
-        }
-
-
-
-        if(type_of_identifier[1] == false)
-        {
-            if(!setPacketValueDataFieldHeader(packetDataField))
-            {
-                PRINTERROR("Error in set packet value data field header");
-                return false;
-            }
-        }
-
-        if(!setPacketValueSourceDataField(packetDataField, 2))
-        {
-            PRINTERROR("Error in set packet value source data field");
-            return false;
-        }
-
-        if(!setPacketValueTail(packetDataField))
-        {
-            PRINTERROR("Error in set packet value tail");
-            return false;
-        }
-
-    }
-    return true;
-
+	return verified;
 }
 
 
@@ -491,7 +403,7 @@ void Packet::printPacketValue()
     pr = (char**) dataField->getPacketSourceDataField()->printValue();
     for(int i = 0; pr[i] != 0; i++)
         cout << pr[i] << endl;
-    if(dataField->getPacketTail()->getDimension() != 0)
+    if(dataField->getPacketTail()->size() != 0)
     {
         pr = (char**) dataField->getPacketTail()->printValue();
         for(int i = 0; pr[i] != 0; i++)
@@ -502,23 +414,27 @@ void Packet::printPacketValue()
 
 
 
-dword Packet::getDimension()
+dword Packet::size()
 {
-    return header->getDimension() + dataField->getDimension();
+	if(!decodedPacketHeader) {
+		setPacketValueHeader(getBSHeader());
+		decodedPacketHeader = true;
+	}
+	return dimPacketHeader + header->getPacketLength();
 }
 
 
-dword Packet::getMaxDimension()
+dword Packet::sizeMax()
 {
-    dword dimh = header->getDimension();
-    dword dimdf = dataField->getMaxDimension();
+    dword dimh = dimPacketHeader;
+    dword dimdf = dataField->sizeMax();
     return dimh + dimdf;
 }
 
 
 void Packet::generateStream()
 {
-    word dimHeader = header->getDimension();
+    word dimHeader = header->size();
 
     if(first_output_stream_setted == false)
     {
@@ -535,9 +451,9 @@ void Packet::generateStream()
     }
 
     /// PACKET DIMENSIONE MANAGEMENT
-    header->setPacketLength(dataField->getDimension());
+    header->setPacketLength(dataField->size());
     //Field* f = header->getFieldWithPacketDimension();
-    //f->value = dataField->getDimension() - 1;
+    //f->value = dataField->size() - 1;
 
     header->generateStream(bigendian);
     dataField->generateStream(bigendian);
@@ -552,7 +468,7 @@ bool Packet::setPacketValueVerify(ByteStreamPtr prefix, ByteStreamPtr packetHead
     if(packetHeader == NULL || packetDataField == NULL)
         return false;
     /// Second check: dimension control
-    if(header->getDimension() != packetHeader->getDimension())
+    if(header->size() != packetHeader->size())
         return false;
     return true;
 }
@@ -605,10 +521,10 @@ bool Packet::setPacketValueSourceDataField(ByteStreamPtr packetDataField, int de
     }*/
 
 
-    packetLength = dataField->getPacketDataFieldHeader()->getDimension();
+    packetLength = dataField->getPacketDataFieldHeader()->size();
     dword pl1 = header->getPacketLength();
-    dword pl3 = dataField->getPacketDataFieldHeader()->getDimension();
-    dword pl4 = dataField->getPacketTail()->getDimension();
+    dword pl3 = dataField->getPacketDataFieldHeader()->size();
+    dword pl4 = dataField->getPacketTail()->size();
     packetLength2 = pl1 - pl3 -pl4;
     b = tempPacketDataField->setStream(packetDataField, packetLength, packetLength+packetLength2-1);
     if(b)
@@ -628,18 +544,18 @@ bool Packet::setPacketValueTail(ByteStreamPtr packetDataField)
 {
     bool b;
     dword s, e;
-    if(dataField->getPacketTail()->getDimension() == 0)
+    if(dataField->getPacketTail()->size() == 0)
         return true;
     /* NON CANCELLLARE: questo codice sotto funziona bene. Si utilizza
     l'altro solo perche' si suppone che il tail sia sempre posizionato alla fine
     del packet
-    word s1 = dataField->dataFieldHeader->getDimension();
-    word s2 = dataField->sourceDataField->getDimension();
+    word s1 = dataField->dataFieldHeader->size();
+    word s2 = dataField->sourceDataField->size();
     s = s1 + s2;
-    e = s  + dataField->tail->getDimension() - 1;
+    e = s  + dataField->tail->size() - 1;
     */
-    s = packetDataField->getDimension() - dataField->getPacketTail()->getDimension();
-    e = packetDataField->getDimension() - 1;
+    s = packetDataField->size() - dataField->getPacketTail()->size();
+    e = packetDataField->size() - 1;
     b = tempTail->setStream(packetDataField, s, e);
     if(b)
         return dataField->getPacketTail()->setByteStream(tempTail);
@@ -660,35 +576,20 @@ bool Packet::setPacketValueHeader(ByteStreamPtr packetHeader)
         return true;
 }
 
-void Packet::memByteStream(ByteStreamPtr prefix, ByteStreamPtr packet)
-{
-    this->prefix = prefix;
-    this->packet = packet;
-}
 
 
 
-void Packet::memByteStream(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField)
-{
-    this->prefix = prefix;
-    //this->packet = 0;
-    this->header->memByteStream(packetHeader);
-    this->dataField->memByteStream(packetDataField);
-}
-
-
 
 ByteStreamPtr Packet::getOutputStream()
 {
+	//TODO: check
     generateStream();
-    ByteStreamPtr b = ByteStreamPtr(new ByteStream(packet_output->stream, getDimension() + (thereisprefix?dimPrefix:0), bigendian));
+    ByteStreamPtr b = ByteStreamPtr(new ByteStream(packet_output->stream, size() + (thereisprefix?dimPrefix:0), bigendian));
     return b;
 }
 
 ByteStreamPtr Packet::getInputStream()
 {
-    if(packet == 0)
-        packet = ByteStreamPtr(new ByteStream(header->getByteStream(), dataField->getByteStream(), 0));
     return packet;
 }
 
@@ -751,7 +652,7 @@ char* Packet::printSourceDataFieldStream()
 
 char** Packet::printTailValue()
 {
-    if(dataField->getPacketTail()->getDimension() != 0)
+    if(dataField->getPacketTail()->size() != 0)
         return (char**)dataField->getPacketTail()->printValue();
     else
         return 0;
@@ -759,7 +660,7 @@ char** Packet::printTailValue()
 
 char* Packet::printTailStream()
 {
-    if(dataField->getPacketTail()->getDimension() != 0)
+    if(dataField->getPacketTail()->size() != 0)
         return dataField->getPacketTail()->getByteStream()->printStreamInHexadecimal();
 
     else
@@ -768,7 +669,7 @@ char* Packet::printTailStream()
 
 char* Packet::printPacketOutputStream()
 {
-    dword dim = getDimension();
+    dword dim = size();
     if(thereisprefix)
         dim += dimPrefix;
     ByteStream b(packet_output->stream, dim, bigendian); //FIXME
@@ -776,48 +677,108 @@ char* Packet::printPacketOutputStream()
     return c;
 }
 
-bool Packet::verifyPacketValue(byte* stream) {
 
 
-	dword dimPre = 0;
-	if(thereisprefix)
-	        dimPre += dimPrefix;
-	ByteStreamPtr prefix = ByteStreamPtr(new ByteStream(stream, dimPre, bigendian));
+bool Packet::set(ByteStreamPtr stream, bool checkPacketLength) {
 
-	dword dim = 0;
-	dword dimHeader = header->getDimension();
-	dim += dimHeader;
-	tempHeader->setStream(stream+dimPre, dimHeader, bigendian);
-	header->setByteStream(tempHeader);
-	dim += header->getDimensionOfPacketLength() + 1;
-	ByteStreamPtr packet = ByteStreamPtr(new ByteStream(stream+dimPre, dim, bigendian));
+	//save a pointer to the current stream to avoid shareptr deallocation
+	this->stream = stream;
+	decodedPacketHeader = false;
+	decodedPacketDataFieldHeader = false;
+	decodedPacketSourceDataField = false;
+	decodedPacketTail = false;
+	
+	if(!checkPacketLength)
+	{
+		
+		if(thereisprefix) {
+			prefix = ByteStreamPtr(new ByteStream(stream->stream, dimPrefix, bigendian));
+			packet = ByteStreamPtr(new ByteStream(stream->stream + dimPrefix, stream->size() - dimPrefix, bigendian));
+			//return true;
+		}
+		else
+		{
+			prefix = 0;
+			packet = stream;
+			//return true;
+		}
+	}
+	else
+	{
+		if(thereisprefix)
+			prefix = ByteStreamPtr(new ByteStream(stream->stream, dimPrefix, bigendian));
+		else
+			prefix = 0;
+		
+		tempHeader->setStream(stream->stream + dimPrefix, dimPacketHeader, bigendian);
+		header->setByteStream(tempHeader);
+		dword dim = dimPacketHeader + header->getPacketLength();
+		if(dimPrefix + dim > stream->size()) {
+			this->packet = 0;
+			throw new PacketException("Packet::set - the ByteStream is too small for the packet lenght of this packet");
+		}
+		
+		packet = ByteStreamPtr(new ByteStream(stream->stream + dimPrefix, dim, bigendian));
+	}
+	//TODO OPTIMIZATION: set the followin method only when is needed
+	setByteStreamSections(); //10 per cent of time loss but safer
+	return true;
 
-	return verifyPacketValue(prefix, packet);
 }
 
-bool Packet::setPacketValue(ByteStreamPtr stream, int decodeType) {
+bool Packet::set(ByteStreamPtr prefix, ByteStreamPtr packet, bool checkPacketLength) {
 	
-	if(decodeType == 0 && !thereisprefix) {
-		setByteStreamPointers(0, stream);
-		return true;
-	}
+	this->stream = 0;
+	decodedPacketHeader = false;
+	decodedPacketDataFieldHeader = false;
+	decodedPacketSourceDataField = false;
+	decodedPacketTail = false;
 	
-	if(thereisprefix)
-		prefix = ByteStreamPtr(new ByteStream(stream->stream, dimPrefix, bigendian));
+	if(!checkPacketLength)
+	{
+		this->prefix = prefix;
+		this->packet = packet;
+	}
 	else
-		prefix = 0;
+	{
+		this->prefix = prefix;
+		tempHeader->setStream(packet->stream + dimPrefix, dimPacketHeader, bigendian);
+		header->setByteStream(tempHeader);
+		dword dim = dimPacketHeader + header->getPacketLength();
+		if(dimPrefix + dim > packet->size()) {
+			this->packet = 0;
+			throw new PacketException("Packet::set - the ByteStream is too small for the packet lenght of this packet");
+		}
+		this->packet = packet;
+	}
+	//TODO OPTIMIZATION: set the following method only when is needed
+	setByteStreamSections(); //10 per cent of time loss but safer
+	return true;
 	
-	tempHeader->setStream(stream->stream + dimPrefix, dimPacketHeader, bigendian);
-	header->setByteStream(tempHeader);
-	dword dim = dimPacketHeader + header->getPacketLength() + 1;
-	packet = ByteStreamPtr(new ByteStream(stream->stream + dimPrefix, dim, bigendian));
+}
+
+
 
-	//return true;
+bool Packet::set(ByteStreamPtr prefix, ByteStreamPtr packetHeader, ByteStreamPtr packetDataField, bool checkPacketLenght) {
+	//merge packetHeader and packetDataField
+	ByteStreamPtr tmpPacket = ByteStreamPtr(new ByteStream(packetHeader, packetDataField, 0));
+	return set(prefix, tmpPacket, checkPacketLenght);
 	
-	return setPacketValue(prefix, packet, decodeType);
+}
+
+
+void Packet::setByteStreamSections()
+{
 
+	//ByteStreamPtr tempHeader = ByteStreamPtr(new ByteStream(packet, 0, dimPacketHeader-1));
+	//ByteStreamPtr tempDataField = ByteStreamPtr(new ByteStream(packet, dimPacketHeader, packet->size()));
+	tempHeader->setStream(packet, 0, dimPacketHeader-1);
+    tempDataField->setStream(packet, dimPacketHeader, packet->size());
+    this->header->memByteStream(tempHeader);
+    this->dataField->memByteStream(tempDataField);
 }
 
+
 ByteStreamPtr Packet::getBSPrefix() {
 	return prefix;
 }
@@ -842,35 +803,51 @@ ByteStreamPtr Packet::getBSSourceDataFieldsFixedPart() {
 }
 
 ByteStreamPtr Packet::getBSSourceDataFieldsVariablePart() {
-	dword dimvariablepart = packet->getDimension() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
+	dword dimvariablepart = packet->size() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
 	ByteStreamPtr sdff = ByteStreamPtr(new ByteStream(packet->stream + dimPrefix + dimPacketStartingFixedPart, dimvariablepart, bigendian));
 	return sdff;
 }
 
 ByteStreamPtr Packet::getBSTail() {
-	dword dimvariablepart = packet->getDimension() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
-	ByteStreamPtr tail = ByteStreamPtr(new ByteStream(packet->stream + packet->getDimension() - dimPacketTail, dimPacketTail, bigendian));
+	//dword dimvariablepart = packet->size() - dimPrefix - dimPacketStartingFixedPart - dimPacketTail;
+	ByteStreamPtr tail = ByteStreamPtr(new ByteStream(packet->stream + packet->size() - dimPacketTail, dimPacketTail, bigendian));
 	return tail;
 }
 
 
 PacketHeader* Packet::getPacketHeader() {
+	if(!decodedPacketHeader) {
+		setPacketValueHeader(getBSHeader());
+		decodedPacketHeader = true;
+	}
 	return header;
 }
 
 
 DataFieldHeader* Packet::getPacketDataFieldHeader() {
+	if(!decodedPacketDataFieldHeader) {
+		setPacketValueDataFieldHeader(dataField->getByteStream());
+		decodedPacketDataFieldHeader = true;
+	}
 	return dataField->getPacketDataFieldHeader();
 }
 
 
 
 SourceDataField* Packet::getPacketSourceDataField() {
+	if(!decodedPacketSourceDataField) {
+		setPacketValueSourceDataField(dataField->getByteStream(), DECODETYPE);
+		decodedPacketSourceDataField = true;
+	}
 	return dataField->getPacketSourceDataField();
 }
 
 
 PartOfPacket* Packet::getPacketTail() {
+	if(!decodedPacketTail) {
+		setPacketValueTail(getBSTail());
+		decodedPacketTail = true;
+	}
 	return dataField->getPacketTail();
 }
 
diff --git a/src/PacketDataField.cpp b/src/PacketDataField.cpp
index 53012244d4af24127d72d0a728c433207b3f1337..e70e84d919b3a41c424f8f74fe8af3dcd832ced3 100644
--- a/src/PacketDataField.cpp
+++ b/src/PacketDataField.cpp
@@ -37,22 +37,22 @@ PacketDataField::~PacketDataField()
 
 
 
-dword PacketDataField::getDimension()
+dword PacketDataField::size()
 {
     if(sourceDataField != 0)
-        return dataFieldHeader->getDimension() + sourceDataField->getDimension() + tail->getDimension();
+        return dataFieldHeader->size() + sourceDataField->size() + tail->size();
     else
-        return dataFieldHeader->getDimension() + tail->getDimension();
+        return dataFieldHeader->size() + tail->size();
 }
 
 
 
-dword PacketDataField::getMaxDimension()
+dword PacketDataField::sizeMax()
 {
     if(sourceDataField != 0)
-        return dataFieldHeader->getDimension() + sourceDataField->getMaxDimension() + tail->getDimension();
+        return dataFieldHeader->size() + sourceDataField->sizeMax() + tail->size();
     else
-        return dataFieldHeader->getDimension() + tail->getDimension();
+        return dataFieldHeader->size() + tail->size();
 }
 
 
@@ -63,14 +63,14 @@ dword PacketDataField::getMaxDimension()
 
 bool PacketDataField::setOutputStream(ByteStreamPtr os, word first)
 {
-    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), getDimension(), os->isBigendian()));
+    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), size(), os->isBigendian()));
     dataFieldHeader->setOutputStream(os, first);
-    word sdfstart = first + dataFieldHeader->getDimension();
+    word sdfstart = first + dataFieldHeader->size();
     sourceDataField->setOutputStream(os, sdfstart);
     word tailstart = sdfstart;
     if(sourceDataField != 0)
-        tailstart += sourceDataField->getDimension();
-    if(tail->getDimension() != 0)
+        tailstart += sourceDataField->size();
+    if(tail->size() != 0)
         tail->setOutputStream(os, tailstart);
     return true;
 }
diff --git a/src/PacketStream.cpp b/src/PacketStream.cpp
index 800698b98cd74a12546fd41cd8ad7eebcb0d84aa..a07a8d54b090fd0849409b6f7622656ee13b595a 100644
--- a/src/PacketStream.cpp
+++ b/src/PacketStream.cpp
@@ -74,7 +74,7 @@ dword PacketStream::getPacketDimension(ByteStreamPtr stream) {
 	//ByteStreamPtr prefix = new ByteStream(stream, dimPre, bigendian);
 	
 	dword dim = 0;
-	dword dimHeader = headerReference->getDimension();
+	dword dimHeader = headerReference->size();
 	dim += dimHeader;
 	ByteStreamPtr tempHeader = ByteStreamPtr(new ByteStream());
 	tempHeader->setStream(stream->stream+dimPre, dimHeader, bigendian);
@@ -91,7 +91,8 @@ int PacketStream::detPacketType(ByteStreamPtr prefix, ByteStreamPtr packetHeader
     for (int i = 1; i<numberOfPacketType; i++)
     {
         Packet* p = getPacketType(i);
-        if(p->verifyPacketValue(prefix, packetHeader, packetDataField))
+		p->set(prefix, packetHeader, packetDataField);
+        if(p->verify())
             return i;
     }
     return 0;
@@ -104,7 +105,8 @@ int PacketStream::detPacketType(ByteStreamPtr prefix, ByteStreamPtr packet)
     for (dword i = 1; i<numberOfPacketType; i++)
     {
         Packet* p = getPacketType(i);
-        if(p->verifyPacketValue(prefix, packet))
+		p->set(prefix, packet);
+        if(p->verify())
             return i;
     }
     return 0;
@@ -118,7 +120,8 @@ int PacketStream::detPacketType(ByteStreamPtr packet)
     for (dword i = 1; i<numberOfPacketType; i++)
     {
         Packet* p = getPacketType(i);
-        if(p->verifyPacketValue(packet->stream))
+		p->set(packet);
+        if(p->verify())
             return i;
     }
     return 0;
@@ -126,13 +129,13 @@ int PacketStream::detPacketType(ByteStreamPtr packet)
 
 
 
-Packet* PacketStream::getPacket(ByteStreamPtr stream, int decodeType) throw(PacketException*){
+Packet* PacketStream::getPacket(ByteStreamPtr stream) throw(PacketException*){
 	
 	int index = detPacketType(stream);
 	if(index > 0) {
 		Packet* p = getPacketType(index);
 		
-		if(!p->setPacketValue(stream, decodeType)) //gli stream diventano del packet
+		if(!p->set(stream)) //gli stream diventano del packet
 			throw new PacketExceptionIO("it is impossible to resolve the packet.");
 		
 		return p;
@@ -217,7 +220,7 @@ bool PacketStream::createStreamStructure() throw(PacketException*)
                     throw new PacketExceptionFileFormat("No parameters in file header format");
                     return false;
                 }
-				dimHeader = headerReference->getDimension();
+				dimHeader = headerReference->size();
                 /// It creates the PACKET NOT RECOGNIZED
                 PacketNotRecognized* p = new PacketNotRecognized(bigendian);
                 if(!p->createPacketType(line, prefix, dimPrefix))
diff --git a/src/PartOfPacket.cpp b/src/PartOfPacket.cpp
index 1949fb4e5a0fb20ac28230691fd6fa7d4d6edf7b..2677ca6d1ef7eaff51b0e73b7b20d540005f91dc 100644
--- a/src/PartOfPacket.cpp
+++ b/src/PartOfPacket.cpp
@@ -115,7 +115,7 @@ bool PartOfPacket::loadFields(InputText& fp) throw(PacketException*)
         dimension = fp.getLine();
         value = fp.getLine();
         Field* f = new Field(name, dimension, value, numberOfFields);
-        fieldsDimension += f->getDimension();
+        fieldsDimension += f->size();
         fields[numberOfFields] = f;
         numberOfFields++;
         name = fp.getLine();
@@ -154,7 +154,7 @@ bool PartOfPacket::loadFields(MemoryBuffer* buffer) throw(PacketException*)
         dimension = buffer->getbuffer();
         value = buffer->getbuffer();
         Field* f = new Field(name, dimension, value, numberOfFields);
-        fieldsDimension += f->getDimension();
+        fieldsDimension += f->size();
         fields[numberOfFields] = f;
         numberOfFields++;
         name = buffer->getbuffer();
@@ -209,12 +209,12 @@ bool PartOfPacket::setByteStream(ByteStreamPtr s)
     /// If NULL is passed it exits
     if(s == NULL) return true;
 
-    if(getDimension() > s->getDimension())
+    if(size() > s->size())
         return false;
 
 
     if(!s->getMemAllocation())
-        stream->setStream(s->stream, s->getDimension(), s->isBigendian());
+        stream->setStream(s->stream, s->size(), s->isBigendian());
 
     /// The stream is assigned
     this->stream = s;
@@ -227,7 +227,7 @@ bool PartOfPacket::decode() {
 	if(decoded)
 		return true;
 	Field* ftemp;
-    //this->stream->setStream(s, 0, s->getDimension() - 1);
+    //this->stream->setStream(s, 0, s->size() - 1);
     /// The pointer is converted from byte to void. The reading from file allows the correct data interpretation
     /// for big or little endian machines
     byte* stream = (byte*) this->stream->stream;
@@ -248,7 +248,7 @@ bool PartOfPacket::decode() {
     for(word i=0; i<nof; i++)
     {
         ftemp =  fields[i];
-        dimbit = ftemp->getDimension();
+        dimbit = ftemp->size();
         /// Temporary word to be modified for the elaboration
         byte bh = *(stream + posword);
         byte bl = *(stream + posword + 1);
@@ -334,7 +334,7 @@ char** PartOfPacket::printValue(const char* addString)
         s1 = "";
         s2 = f->getName();
         s2 += " (";
-        s2 += Utility::integerToString(f->getDimension());
+        s2 += Utility::integerToString(f->size());
         s2 +=  ") - ";
         s2 += "Value: ";
         s2 += s;
@@ -374,7 +374,7 @@ void PartOfPacket::printValueStdout()
         s1 = "";
         s2 = f->getName();
         s2 += " (";
-        s2 += Utility::integerToString(f->getDimension());
+        s2 += Utility::integerToString(f->size());
         s2 +=  ") - ";
         s2 += "Value: ";
         s2 += s;
@@ -408,14 +408,14 @@ ByteStreamPtr PartOfPacket::generateStream(bool bigendian)
     /// Dimension of the current field
     byte dimbit = 0;
     if(outputstream == 0)
-        outputstream = ByteStreamPtr(new ByteStream(getDimension(), bigendian));
+        outputstream = ByteStreamPtr(new ByteStream(size(), bigendian));
     for(unsigned i = 0; i<numberOfFields; i++)
     {
         if(!fields[i]->thereIsPredefinedValue())
             wtemp = fields[i]->value;
         else
             wtemp = fields[i]->value =  fields[i]->getPredefinedValue();
-        dimbit = fields[i]->getDimension();
+        dimbit = fields[i]->size();
         shift = 16 - dimbit - posbit;
         if(shift < 0)
         {
@@ -437,7 +437,7 @@ ByteStreamPtr PartOfPacket::generateStream(bool bigendian)
             wtemp = (wtemp << shift);
             w = w | wtemp;
             //cout << (Utility::wordToBinary(w, 16))->c_str() << endl;
-            posbit += fields[i]->getDimension();
+            posbit += fields[i]->size();
         }
         if(posbit == 16)
         {
@@ -463,14 +463,14 @@ ByteStreamPtr PartOfPacket::generateStream(bool bigendian)
 
 bool PartOfPacket::setOutputStream(ByteStreamPtr os, dword first)
 {
-    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), getDimension(), os->isBigendian()));
+    outputstream = ByteStreamPtr(new ByteStream((os->stream + first), size(), os->isBigendian()));
     return true;
 }
 
 void PartOfPacket::setFieldValue(word index, word value)
 {
     if(index < numberOfFields)
-        fields[index]->value = (value & pattern[fields[index]->getDimension()]);
+        fields[index]->value = (value & pattern[fields[index]->size()]);
 }
 
 float PartOfPacket::getFieldValue_5_1(word index)
diff --git a/src/SDFBlock.cpp b/src/SDFBlock.cpp
index 7d8df5cb19440943b44af68490670cab08682984..1b4be7c7e57550323cddf94efe2808aa37dc9714 100644
--- a/src/SDFBlock.cpp
+++ b/src/SDFBlock.cpp
@@ -339,23 +339,23 @@ bool SDFBlock::loadFields(InputText& fp) throw (PacketException*)
 }
 
 //OK
-dword SDFBlock::getMaxDimension()
+dword SDFBlock::sizeMax()
 {
 	/// for fixed part
-    dword dim = fixed.getDimension(); 
+    dword dim = fixed.size(); 
     ///variable part
 
     for(dword i=0; i < type->nblockmax; i++)
     {
-        dim += block[i].getMaxDimension();
+        dim += block[i].sizeMax();
     }
     return dim;
 }
 
-dword SDFBlock::getDimension()
+dword SDFBlock::size()
 {
 	/// for fixed part
-    dword dim = fixed.getDimension(); 
+    dword dim = fixed.size(); 
     word bi = 0;
     word rbi = 0;
     for(int i=0; i < type->nblockmax; i++)
@@ -364,7 +364,7 @@ dword SDFBlock::getDimension()
         rbi = block[i].getRBlockType();
         word nrdb = getNumberOfRealDataBlock(rbi);
         if(bi < nrdb)
-            dim += block[i].getDimension();
+            dim += block[i].size();
         else
             i += type->maxNumberOfBlock[rbi] - getNumberOfRealDataBlock(rbi) - 1;
     }
@@ -462,8 +462,8 @@ bool SDFBlock::setOutputStream(ByteStreamPtr os, dword first)
     if(type->fixedPresent)
     {
         fixed.setOutputStream(os, start);
-        outputstream = ByteStreamPtr(new ByteStream((os->stream + start), getDimension(), os->isBigendian()));
-        start += fixed.getDimension();
+        outputstream = ByteStreamPtr(new ByteStream((os->stream + start), size(), os->isBigendian()));
+        start += fixed.size();
     }
     if(type->variablePresent)
     {
@@ -477,7 +477,7 @@ bool SDFBlock::setOutputStream(ByteStreamPtr os, dword first)
             {
                 /// Only for valid blocks
                 block[i].setOutputStream(os, start);
-                start += block[i].getDimension();
+                start += block[i].size();
             }
             else
                 i += type->maxNumberOfBlock[rbi] - getNumberOfRealDataBlock(rbi) - 1;
@@ -517,17 +517,17 @@ bool SDFBlock::setByteStream(ByteStreamPtr s, int decodeType)
 	//cout << "bool SDFBlock::setByteStream(ByteStreamPtr s)" << " " << s << endl; //AB
     dword bytestart=0;
     dword bytestop=0;
-    this->stream->setStream(s, 0, s->getDimension() - 1);
+    this->stream->setStream(s, 0, s->size() - 1);
 	
 	if(decodeType == 0)
 		return true;
 
-    //ByteStreamPtr  tmpstream = new ByteStream(s->stream, s->getDimension(), s->isBigendian());
-    //ByteStreamPtr s = new ByteStream(k->stream, k->getDimension(), k->isBigendian());
+    //ByteStreamPtr  tmpstream = new ByteStream(s->stream, s->size(), s->isBigendian());
+    //ByteStreamPtr s = new ByteStream(k->stream, k->size(), k->isBigendian());
     // It sets the output stream for the fixed part (if present)
     if(type->fixedPresent)
     {
-        bytestop += fixed.getDimension() - 1;
+        bytestop += fixed.size() - 1;
         if(tempBlock1->setStream(s, bytestart, bytestop))
             if(!fixed.setByteStream(tempBlock1))
                 return false;
@@ -548,14 +548,14 @@ bool SDFBlock::setByteStream(ByteStreamPtr s, int decodeType)
             {
                 /// Only for valid blocks
             	/// 1) first of all the fixed part of block[i] must be set 
-            	/// before calling  block[i].getDimension(), otherwise only random values are present
-                tempBlock1->setStream(s, bytestart, s->getDimension() - 1);
+            	/// before calling  block[i].size(), otherwise only random values are present
+                tempBlock1->setStream(s, bytestart, s->size() - 1);
                 block[i].setByteStream(tempBlock1, decodeType);
                 /// 2) Now the correct computation of the dimension can be started
                 if(bytestop != 0)
-                    bytestop += block[i].getDimension();
+                    bytestop += block[i].size();
                 else
-                    bytestop += block[i].getDimension() - 1;
+                    bytestop += block[i].size() - 1;
                 if(tempBlock1->setStream(s, bytestart, bytestop))
                     if(!block[i].setByteStream(tempBlock1, decodeType))
                         return false;
diff --git a/src/Socket.cpp b/src/Socket.cpp
index 760a8414b5d2885ce24ce32b824022beac6eec09..6012c68101f6f11f6e34d56ef2813bf00b0ddb5a 100644
--- a/src/Socket.cpp
+++ b/src/Socket.cpp
@@ -79,7 +79,7 @@ bool Socket::send ( ByteStreamPtr b ) const throw(PacketExceptionIO*)
 {
     byte* stream = b->getOutputStream();
     //MSG_NOSIGNAL
-    int status = ::send ( m_sock, stream, b->getDimension(),  MSG_DONTROUTE);
+    int status = ::send ( m_sock, stream, b->size(),  MSG_DONTROUTE);
     b->endOutputStream();
     if ( status == -1 )
     {
@@ -109,7 +109,7 @@ ByteStreamPtr Socket::recv (word dim, int & status ) throw(PacketExceptionIO*)
 
     /*if(!bigendian)
     {
-        word dim =  b->getDimension();
+        word dim =  b->size();
         for(word i = 0; i< dim; i+=2) {
             if((dim - i) != 1) { //per dimensioni dispari
                 byte btemp = b->stream[i];
diff --git a/src/SourceDataField.cpp b/src/SourceDataField.cpp
index b0d811c695fec005f57b33696c05e215d8c472f3..87023613ea46b2f6bc663320529ce0c29f09fb47 100644
--- a/src/SourceDataField.cpp
+++ b/src/SourceDataField.cpp
@@ -84,7 +84,7 @@ bool SourceDataField::loadFields(InputText& fp) throw(PacketException*)
 
 char* SourceDataField::printInHexadecimal()
 {
-    dword dim = getDimension();
+    dword dim = size();
     ByteStream b(stream->stream, dim, true);
     char* c = b.printStreamInHexadecimal();
     return c;
@@ -96,19 +96,19 @@ SDFBlock* SourceDataField::getBlock(word nblock,word rBlockIndex)
 }
 
 
-dword SourceDataField::getMaxDimension()
+dword SourceDataField::sizeMax()
 {
-    return block[0].getMaxDimension();
+    return block[0].sizeMax();
 }
 
-dword SourceDataField::getDimension()
+dword SourceDataField::size()
 {
-    return block[0].getDimension();
+    return block[0].size();
 }
 
-dword SourceDataField::getDimensionFixedPart()
+dword SourceDataField::sizeFixedPart()
 {
-    return block[0].fixed.getDimension();
+    return block[0].fixed.size();
 }
 
 void SourceDataField::setNumberOfRealDataBlock(word number, word rblockIndex)  throw (PacketException*)