Index: src/libchcore/TOverlappedWriter.cpp
===================================================================
diff -u -N -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9 -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28
--- src/libchcore/TOverlappedWriter.cpp	(.../TOverlappedWriter.cpp)	(revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9)
+++ src/libchcore/TOverlappedWriter.cpp	(.../TOverlappedWriter.cpp)	(revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28)
@@ -40,6 +40,11 @@
 	{
 	}
 
+	TOverlappedDataBuffer* TOverlappedWriter::GetWriteBuffer()
+	{
+		return m_tBuffersToWrite.Pop();
+	}
+
 	void TOverlappedWriter::AddFailedWriteBuffer(TOverlappedDataBuffer* pBuffer)
 	{
 		if(!pBuffer)
@@ -66,9 +71,30 @@
 
 	TOverlappedDataBuffer* TOverlappedWriter::GetFinishedBuffer()
 	{
-		return m_tFinishedBuffers.Pop();
+		TOverlappedDataBuffer* pBuffer = m_tFinishedBuffers.Pop();
+
+		if (pBuffer && pBuffer->IsLastPart())
+		{
+			if (m_pLastPartBuffer != nullptr)
+				throw TCoreException(eErr_InternalProblem, L"Encountered another 'last-part' finished buffer", LOCATION);
+			m_pLastPartBuffer = pBuffer;
+		}
+
+		return pBuffer;
 	}
 
+	void TOverlappedWriter::MarkAsFinalized(TOverlappedDataBuffer* pBuffer)
+	{
+		if (!pBuffer)
+			throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION);
+
+		if (pBuffer != m_pLastPartBuffer)
+			throw TCoreException(eErr_InvalidArgument, L"Trying to mark different buffer as finalized", LOCATION);
+
+		m_bDataWritingFinished = true;
+		m_pLastPartBuffer = nullptr;
+	}
+
 	void TOverlappedWriter::AddFinishedBuffer(TOverlappedDataBuffer* pBuffer)
 	{
 		if (!pBuffer)
@@ -87,6 +113,13 @@
 
 	size_t TOverlappedWriter::GetBufferCount() const
 	{
-		return m_tBuffersToWrite.GetCount() + m_tFailedWriteBuffers.GetCount() + m_tFinishedBuffers.GetCount();
+		return m_tFailedWriteBuffers.GetCount() + m_tFinishedBuffers.GetCount();
 	}
+
+	void TOverlappedWriter::ReleaseBuffers(const TBufferListPtr& spList)
+	{
+		m_tBuffersToWrite.ReleaseBuffers(spList);
+		m_tFailedWriteBuffers.ReleaseBuffers(spList);
+		m_tFinishedBuffers.ReleaseBuffers(spList);
+	}
 }