diff --git a/test/btest.cpp b/test/btest.cpp
index 26f104f..13b790b 100644
--- a/test/btest.cpp
+++ b/test/btest.cpp
@@ -37,7 +37,7 @@
         ret = mb1->SetValueInfo(&vi1);
         ret = mb1->SetExtraValues(ev1, 10);
     }
-    ret = mb1->GetBytes(bytes, size);
+    ret = mb1->Serialize(bytes, size);
     printf("assembling IntelMetadataBuffer %s, ret = %d\n", (ret == IMB_SUCCESS)?"Success":"Fail", ret );    
 
     printf("size = %d, bytes = ", size);
@@ -48,7 +48,7 @@
     printf("\n");
 
     mb2 = new IntelMetadataBuffer();
-    ret = mb2->SetBytes(bytes, size);
+    ret = mb2->UnSerialize(bytes, size);
     printf("parsing IntelMetadataBuffer %s, ret = %d\n", (ret == IMB_SUCCESS)?"Success":"Fail", ret );    
     
     ret = mb2->GetType(t2);
diff --git a/test/mix_encoder.cpp b/test/mix_encoder.cpp
index 38fbc00..d4b88c0 100644
--- a/test/mix_encoder.cpp
+++ b/test/mix_encoder.cpp
@@ -697,7 +697,7 @@
     {
         if (gMode != 4)
         {
-            gIMB[i % gSrcFrames]->GetBytes(data, size);
+            gIMB[i % gSrcFrames]->Serialize(data, size);
      //       printf("srcno =%d, data=%x, size=%d\n", i % gSrcFrames, data, size);
         }else
         {
@@ -729,11 +729,10 @@
 		stat.total_frames, stat.skipped_frames, stat.average_encode_time, stat.max_encode_time, stat.max_encode_frame, \
 		stat.min_encode_time, stat.min_encode_frame );
     }
-    if(gVideoEncoder) {
-        releaseVideoEncoder(gVideoEncoder);
-        gVideoEncoder = NULL;
-    }
 
+    gVideoEncoder->stop();
+    releaseVideoEncoder(gVideoEncoder);
+    gVideoEncoder = NULL;
     
     switch(gMode)
     {
diff --git a/videoencoder/IntelMetadataBuffer.cpp b/videoencoder/IntelMetadataBuffer.cpp
index 531d0ca..eb9fe43 100644
--- a/videoencoder/IntelMetadataBuffer.cpp
+++ b/videoencoder/IntelMetadataBuffer.cpp
@@ -60,6 +60,55 @@
         delete[] mBytes;
 }
 
+
+IntelMetadataBuffer::IntelMetadataBuffer(const IntelMetadataBuffer& imb)
+     :mType(imb.mType), mValue(imb.mValue), mInfo(NULL), mExtraValues(NULL),
+      mExtraValues_Count(imb.mExtraValues_Count), mBytes(NULL), mSize(imb.mSize)
+{
+    if (imb.mInfo)
+        mInfo = new ValueInfo(*imb.mInfo);
+
+    if (imb.mExtraValues)
+    {
+        mExtraValues = new int32_t[mExtraValues_Count];
+        memcpy(mExtraValues, imb.mExtraValues, 4 * mExtraValues_Count);
+    }
+
+    if (imb.mBytes)
+    {
+        mBytes = new uint8_t[mSize];
+        memcpy(mBytes, imb.mBytes, mSize);
+    }
+}
+
+const IntelMetadataBuffer& IntelMetadataBuffer::operator=(const IntelMetadataBuffer& imb)
+{
+    mType = imb.mType;
+    mValue = imb.mValue;
+    mInfo = NULL;
+    mExtraValues = NULL;
+    mExtraValues_Count = imb.mExtraValues_Count;
+    mBytes = NULL;
+    mSize = imb.mSize;
+
+    if (imb.mInfo)
+        mInfo = new ValueInfo(*imb.mInfo);
+
+    if (imb.mExtraValues)
+    {
+        mExtraValues = new int32_t[mExtraValues_Count];
+        memcpy(mExtraValues, imb.mExtraValues, 4 * mExtraValues_Count);
+    }
+
+    if (imb.mBytes)
+    {
+        mBytes = new uint8_t[mSize];
+        memcpy(mBytes, imb.mBytes, mSize);
+    }
+
+    return *this;
+}
+
 IMB_Result IntelMetadataBuffer::GetType(MetadataBufferType& type)
 {
     type = mType;
@@ -143,7 +192,7 @@
     return IMB_SUCCESS;
 }
 
-IMB_Result IntelMetadataBuffer::SetBytes(uint8_t* data, uint32_t size)
+IMB_Result IntelMetadataBuffer::UnSerialize(uint8_t* data, uint32_t size)
 {
     if (!data || size == 0)
         return IMB_INVAL_PARAM;
@@ -214,7 +263,12 @@
     return IMB_SUCCESS;
 }
 
-IMB_Result IntelMetadataBuffer::GetBytes(uint8_t* &data, uint32_t& size)
+IMB_Result IntelMetadataBuffer::SetBytes(uint8_t* data, uint32_t size)
+{
+    return UnSerialize(data, size);
+}
+
+IMB_Result IntelMetadataBuffer::Serialize(uint8_t* &data, uint32_t& size)
 {
     if (mBytes == NULL)
     {
@@ -253,6 +307,11 @@
     return IMB_SUCCESS;
 }
 
+IMB_Result IntelMetadataBuffer::GetBytes(uint8_t* &data, uint32_t& size)
+{
+    return Serialize(data, size);
+}
+
 uint32_t IntelMetadataBuffer::GetMaxBufferSize()
 {
     return 256;
diff --git a/videoencoder/IntelMetadataBuffer.h b/videoencoder/IntelMetadataBuffer.h
index 802ef7b..2eacc5f 100644
--- a/videoencoder/IntelMetadataBuffer.h
+++ b/videoencoder/IntelMetadataBuffer.h
@@ -72,6 +72,9 @@
     IntelMetadataBuffer(MetadataBufferType type, int32_t value);    //for quick generator
     ~IntelMetadataBuffer();
 
+    IntelMetadataBuffer(const IntelMetadataBuffer& imb);
+    const IntelMetadataBuffer& operator=(const IntelMetadataBuffer& imb);
+
     IMB_Result GetType(MetadataBufferType &type);
     IMB_Result SetType(MetadataBufferType type);
     IMB_Result GetValue(int32_t &value);
@@ -81,12 +84,15 @@
     IMB_Result GetExtraValues(int32_t* &values, uint32_t &num);
     IMB_Result SetExtraValues(int32_t *values, uint32_t num);
 
-    //for bytes input, also for parser
+    //for bytes input, also for parser, will be obsoleted
     IMB_Result SetBytes(uint8_t* data, uint32_t size);
-
-    //for bytes output, also for generator
+    //for bytes output, also for generator, will be obsoleted
     IMB_Result GetBytes(uint8_t* &data, uint32_t& size);
 
+    //New API for bytes input/ouput, UnSerialize=SetBytes, Serialize=GetBytes
+    IMB_Result UnSerialize(uint8_t* data, uint32_t size);
+    IMB_Result Serialize(uint8_t* &data, uint32_t& size);
+
     //Static, for get max IntelMetadataBuffer size
     static uint32_t GetMaxBufferSize();
 
diff --git a/videoencoder/VideoEncoderAVC.cpp b/videoencoder/VideoEncoderAVC.cpp
index 5922e6a..738eefa 100644
--- a/videoencoder/VideoEncoderAVC.cpp
+++ b/videoencoder/VideoEncoderAVC.cpp
@@ -197,9 +197,6 @@
     Encode_Status ret = ENCODE_SUCCESS;
     VAStatus vaStatus = VA_STATUS_SUCCESS;
     bool useLocalBuffer = false;
-    uint32_t nalType = 0;
-    uint32_t nalSize = 0;
-    uint32_t nalOffset = 0;
     uint32_t idrPeroid = mComParams.intraPeriod * mVideoParamsAVC.idrInterval;
 
     LOG_V("Begin\n");
@@ -283,8 +280,6 @@
         uint32_t *nalType, uint32_t *nalOffset, uint32_t status) {
     uint32_t pos = 0;
     uint32_t zeroByteCount = 0;
-    uint32_t prefixLength = 0;
-    uint32_t leadingZeroCnt = 0;
     uint32_t singleByteTable[3][2] = {{1,0},{2,0},{2,3}};
     uint32_t dataRemaining = 0;
     uint8_t *dataPtr;
@@ -520,7 +515,6 @@
     uint32_t nalSize = 0;
     uint32_t nalOffset = 0;
     uint32_t sizeCopiedHere = 0;
-    uint32_t sizeToBeCopied = 0;
 
     CHECK_NULL_RETURN_IFFAIL(mCurSegment->buf);
 
@@ -648,7 +642,6 @@
 Encode_Status VideoEncoderAVC::renderMaxSliceSize() {
 
     VAStatus vaStatus = VA_STATUS_SUCCESS;
-    Encode_Status ret = ENCODE_SUCCESS;
     LOG_V( "Begin\n\n");
 
     if (mComParams.rcMode != RATE_CONTROL_VCM) {
@@ -794,12 +787,6 @@
     avcSeqParams.intra_idr_period = mVideoParamsAVC.idrInterval;
     avcSeqParams.picture_width_in_mbs = (mComParams.resolution.width + 15) / 16;
     avcSeqParams.picture_height_in_mbs = (mComParams.resolution.height + 15) / 16;
-    if((avcSeqParams.picture_width_in_mbs >=1920)|| (avcSeqParams.picture_height_in_mbs >=1080))
-    {
-        device_info = vaQueryVendorString(mVADisplay);
-        if(strstr(device_info, "LEXINGTON"))
-            return ENCODE_INVALID_PARAMS;
-    }
 
     level = calcLevel (avcSeqParams.picture_width_in_mbs * avcSeqParams.picture_height_in_mbs);
     avcSeqParams.level_idc = level;
@@ -913,7 +900,6 @@
     VAStatus vaStatus = VA_STATUS_SUCCESS;
 
     uint32_t sliceNum = 0;
-    uint32_t sliceHeight = 0;
     uint32_t sliceIndex = 0;
     uint32_t sliceHeightInMB = 0;
     uint32_t maxSliceNum = 0;
diff --git a/videoencoder/VideoEncoderBase.cpp b/videoencoder/VideoEncoderBase.cpp
index b574d2c..f4df5e2 100644
--- a/videoencoder/VideoEncoderBase.cpp
+++ b/videoencoder/VideoEncoderBase.cpp
@@ -649,7 +649,6 @@
 Encode_Status VideoEncoderBase::prepareForOutput(
         VideoEncOutputBuffer *outBuffer, bool *useLocalBuffer) {
 
-    Encode_Status ret = ENCODE_SUCCESS;
     VAStatus vaStatus = VA_STATUS_SUCCESS;
     VACodedBufferSegment *vaCodedSeg = NULL;
     uint32_t status = 0;
@@ -733,7 +732,6 @@
 Encode_Status VideoEncoderBase::cleanupForOutput() {
 
     VAStatus vaStatus = VA_STATUS_SUCCESS;
-    Encode_Status ret = ENCODE_SUCCESS;
 
     //mCurSegment is NULL means all data has been copied out
     if (mCurSegment == NULL && mCodedBufferMapped) {
@@ -1733,25 +1731,23 @@
     int32_t *extravalues = NULL;
     unsigned int extravalues_count = 0;
 
-    IntelMetadataBuffer *imb = new IntelMetadataBuffer;
+    IntelMetadataBuffer imb;
     SurfaceMap *map = NULL;
   
     if (mStoreMetaDataInBuffers.isEnabled) {        
         //metadatabuffer mode
         LOG_I("in metadata mode, data=%p, size=%d\n", inBuffer->data, inBuffer->size);
-        if (imb->SetBytes(inBuffer->data, inBuffer->size) != IMB_SUCCESS) {
+        if (imb.UnSerialize(inBuffer->data, inBuffer->size) != IMB_SUCCESS) {
             //fail to parse buffer
-            delete imb;
             return ENCODE_NO_REQUEST_DATA; 
         }
 
-        imb->GetType(type);
-        imb->GetValue(value);
+        imb.GetType(type);
+        imb.GetValue(value);
     } else {
         //raw mode
         LOG_I("in raw mode, data=%p, size=%d\n", inBuffer->data, inBuffer->size);
         if (! inBuffer->data || inBuffer->size == 0) {
-            delete imb;
             return ENCODE_NULL_PTR; 
         }
 
@@ -1767,7 +1763,6 @@
         LOG_I("direct find surface %d from value %x\n", map->surface, value);
         mCurSurface = map->surface;
 
-        delete imb;
         return ret;
     }
 
@@ -1789,8 +1784,8 @@
             vinfo.s3dformat = 0xFFFFFFFF;
         } else {            
             //get all info mapping needs
-            imb->GetValueInfo(pvinfo);                 
-            imb->GetExtraValues(extravalues, extravalues_count);
+            imb.GetValueInfo(pvinfo);                 
+            imb.GetExtraValues(extravalues, extravalues_count);
   	}
         
     } else {
@@ -1825,7 +1820,6 @@
             mSrcSurfaceMapList = appendSurfaceMap(mSrcSurfaceMapList, map);
         } else {
             delete map;
-            delete imb;
             LOG_E("surface mapping failed, wrong info or meet serious error\n");
             return ret;
         } 
@@ -1834,7 +1828,6 @@
 
     } else {
         //can't map due to no info
-        delete imb;
         LOG_E("surface mapping failed,  missing information\n");
         return ENCODE_NO_REQUEST_DATA;
     }
@@ -1861,8 +1854,6 @@
         }
     }
    
-    delete imb;
- 
     return ret;
 }
 
diff --git a/videoencoder/VideoEncoderH263.cpp b/videoencoder/VideoEncoderH263.cpp
index 68f8741..cbe1e09 100644
--- a/videoencoder/VideoEncoderH263.cpp
+++ b/videoencoder/VideoEncoderH263.cpp
@@ -120,7 +120,6 @@
 Encode_Status VideoEncoderH263::renderSliceParams() {
 
     VAStatus vaStatus = VA_STATUS_SUCCESS;
-    uint32_t sliceNum;
     uint32_t sliceHeight;
     uint32_t sliceHeightInMB;
 
diff --git a/videoencoder/VideoEncoderMP4.cpp b/videoencoder/VideoEncoderMP4.cpp
index 51068f4..d93d774 100644
--- a/videoencoder/VideoEncoderMP4.cpp
+++ b/videoencoder/VideoEncoderMP4.cpp
@@ -22,9 +22,7 @@
 Encode_Status VideoEncoderMP4::getHeaderPos(
         uint8_t *inBuffer, uint32_t bufSize, uint32_t *headerSize) {
 
-    uint8_t *buf = inBuffer;
     uint32_t bytesLeft = bufSize;
-    Encode_Status ret = ENCODE_SUCCESS;
 
     *headerSize = 0;
     CHECK_NULL_RETURN_IFFAIL(inBuffer);
