diff --git a/jni/libzrtp/sources/zrtp/ZrtpPacketConfirm.cpp b/jni/libzrtp/sources/zrtp/ZrtpPacketConfirm.cpp
new file mode 100644
index 0000000..6f13cae
--- /dev/null
+++ b/jni/libzrtp/sources/zrtp/ZrtpPacketConfirm.cpp
@@ -0,0 +1,98 @@
+/*
+  Copyright (C) 2006-2013 Werner Dittmann
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * Authors: Werner Dittmann <Werner.Dittmann@t-online.de>
+ */
+
+#include <libzrtpcpp/ZrtpPacketConfirm.h>
+
+ZrtpPacketConfirm::ZrtpPacketConfirm() {
+    DEBUGOUT((fprintf(stdout, "Creating Confirm packet without data, no sl data\n")));
+    initialize();
+    setSignatureLength(0);
+}
+
+ZrtpPacketConfirm::ZrtpPacketConfirm(uint32_t sl) {
+    DEBUGOUT((fprintf(stdout, "Creating Confirm packet without data\n")));
+    initialize();
+    setSignatureLength(sl);
+}
+
+void ZrtpPacketConfirm::initialize() {
+    void* allocated = &data;
+    memset(allocated, 0, sizeof(data));
+
+    zrtpHeader = (zrtpPacketHeader_t *)&((ConfirmPacket_t *)allocated)->hdr;	// the standard header
+    confirmHeader = (Confirm_t *)&((ConfirmPacket_t *)allocated)->confirm;
+
+    setZrtpId();
+}
+
+bool ZrtpPacketConfirm::setSignatureLength(uint32_t sl) {
+    if (sl > 512)
+        return false;
+
+    int32_t length = sizeof(ConfirmPacket_t) + (sl * ZRTP_WORD_SIZE);
+    confirmHeader->sigLength = sl;                                     // sigLength is a uint byte
+    if (sl & 0x100) {                                                  // check the 9th bit
+        confirmHeader->filler[1] = 1;                                  // and set it if necessary
+    }
+    setLength(length / 4);
+    return true;
+}
+
+bool ZrtpPacketConfirm::setSignatureData(uint8_t* data, int32_t length) {
+    int32_t l = getSignatureLength() * 4;
+    if (length > l || (length % 4) != 0)
+        return false;
+
+    uint8_t* p = ((uint8_t*)&confirmHeader->expTime) + 4;              // point to signature block
+    memcpy(p, data, length);
+    return true;
+}
+
+bool ZrtpPacketConfirm::isSignatureLengthOk() {
+    int32_t actualLen = getLength();
+    int32_t expectedLen = 19;                  // Confirm packet fixed part is 19 ZRTP words
+    int32_t sigLen = getSignatureLength();
+
+    if (sigLen > 0) {                          // We have a signature
+        expectedLen += sigLen + 1;             // +1 for the signature length field
+    }
+    return (expectedLen == actualLen);
+}
+
+int32_t ZrtpPacketConfirm::getSignatureLength() {
+    int32_t sl = confirmHeader->sigLength & 0xff;
+    if (confirmHeader->filler[1] == 1) {                              // do we have a 9th bit
+        sl |= 0x100;
+    }
+    return sl;
+}
+
+ZrtpPacketConfirm::ZrtpPacketConfirm(uint8_t* data) {
+    DEBUGOUT((fprintf(stdout, "Creating Confirm packet from data\n")));
+
+    allocated = NULL;
+    zrtpHeader = (zrtpPacketHeader_t *)&((ConfirmPacket_t *)data)->hdr;	// the standard header
+    confirmHeader = (Confirm_t *)&((ConfirmPacket_t *)data)->confirm;
+}
+
+ZrtpPacketConfirm::~ZrtpPacketConfirm() {
+    DEBUGOUT((fprintf(stdout, "Deleting Confirm packet: alloc: %x\n", allocated)));
+}
