Index: PHPCadesAbout.cpp
===================================================================
--- PHPCadesAbout.cpp	(revision 161471)
+++ PHPCadesAbout.cpp	(working copy)
@@ -7,8 +7,9 @@
 
 //Методы
 PHP_METHOD(About, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     about_obj *obj =
-        (about_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (about_obj *)((char *)zobj - XtOffsetOf(about_obj, zobj));
     obj->m_pCppCadesImpl =
         boost::shared_ptr<CPPCadesAboutObject>(new CPPCadesAboutObject());
 }
@@ -15,8 +16,9 @@
 
 PHP_METHOD(About, get_MajorVersion) {
     unsigned int version;
+    zend_object *zobj = Z_OBJ_P(getThis());
     about_obj *obj =
-        (about_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (about_obj *)((char *)zobj - XtOffsetOf(about_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_MajorVersion(&version));
 
     RETURN_LONG(version);
@@ -25,8 +27,9 @@
 PHP_METHOD(About, get_MinorVersion) {
     unsigned int version;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     about_obj *obj =
-        (about_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (about_obj *)((char *)zobj - XtOffsetOf(about_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_MinorVersion(&version));
 
     RETURN_LONG(version);
@@ -35,8 +38,9 @@
 PHP_METHOD(About, get_BuildVersion) {
     unsigned int version;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     about_obj *obj =
-        (about_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (about_obj *)((char *)zobj - XtOffsetOf(about_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_BuildVersion(&version));
 
     RETURN_LONG(version);
@@ -45,8 +49,9 @@
 PHP_METHOD(About, get_Version) {
     CAtlString AtlVersion;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     about_obj *obj =
-        (about_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (about_obj *)((char *)zobj - XtOffsetOf(about_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Version(AtlVersion));
 
     RETURN_ATL_STRING(AtlVersion);
@@ -56,13 +61,17 @@
 
     boost::shared_ptr<CPPVersionObject> version;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     about_obj *obj =
-        (about_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (about_obj *)((char *)zobj - XtOffsetOf(about_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_PluginVersion(version));
 
     object_init_ex(return_value, version_ce);
+    
+    zobj = Z_OBJ_P(return_value);
     version_obj *pPluginVersion =
-        (version_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (version_obj *)((char *)zobj - XtOffsetOf(version_obj, zobj));
     pPluginVersion->m_pCppCadesImpl = version;
 }
 
@@ -70,7 +79,7 @@
 
     boost::shared_ptr<CPPVersionObject> version;
     char *szProvName;
-    int szProvName_len = 0;
+    size_t szProvName_len = 0;
     DWORD dwProvType = 75;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sl", &szProvName,
@@ -79,14 +88,18 @@
 
     CAtlString provName =
         CAtlString(CA2CT(CAtlStringA(szProvName, szProvName_len), CP_UTF8));
+
+    zend_object *zobj = Z_OBJ_P(getThis());
     about_obj *obj =
-        (about_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (about_obj *)((char *)zobj - XtOffsetOf(about_obj, zobj));
+
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_CSPVersion(provName, dwProvType, version));
 
     object_init_ex(return_value, version_ce);
+    zobj = Z_OBJ_P(return_value);
     version_obj *pCSPVersion =
-        (version_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (version_obj *)((char *)zobj - XtOffsetOf(version_obj, zobj));
     pCSPVersion->m_pCppCadesImpl = version;
 }
 
@@ -94,39 +107,22 @@
 zend_object_handlers about_obj_handlers;
 zend_class_entry *about_ce;
 
-void about_free_storage(void *object TSRMLS_DC) {
-    about_obj *obj = (about_obj *)object;
+static void about_free(zend_object *object TSRMLS_DC) {
+    about_obj *obj = (about_obj *)((char *)object - XtOffsetOf(about_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value about_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* about_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    about_obj *obj = (about_obj *)emalloc(sizeof(about_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(about_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &about_obj_handlers;
 
-    about_obj *obj = (about_obj *)emalloc(sizeof(about_obj));
-    memset(obj, 0, sizeof(about_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, about_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &about_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -147,4 +143,6 @@
     memcpy(&about_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     about_obj_handlers.clone_obj = NULL;
+    about_obj_handlers.free_obj = about_free;
+    about_obj_handlers.offset = XtOffsetOf(about_obj, zobj);
 }
Index: PHPCadesAbout.h
===================================================================
--- PHPCadesAbout.h	(revision 161471)
+++ PHPCadesAbout.h	(working copy)
@@ -6,11 +6,11 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct about_obj {
-    zend_object zo;
+typedef struct _about_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesAboutObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} about_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers about_obj_handlers;
@@ -18,11 +18,11 @@
 extern zend_class_entry *about_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void about_free_storage(void *object TSRMLS_DC);
+// void about_free_storage(void *object TSRMLS_DC);
 
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value about_create_handler(zend_class_entry *type TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value about_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPAlgorithm.cpp
===================================================================
--- PHPCadesCPAlgorithm.cpp	(revision 161471)
+++ PHPCadesCPAlgorithm.cpp	(working copy)
@@ -6,8 +6,9 @@
 PHP_METHOD(CPAlgorithm, __construct) {
     CPPCadesCPAlgorithmObject *algo;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     algo_obj *obj =
-        (algo_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (algo_obj *)((char *)zobj - XtOffsetOf(algo_obj, zobj));
     algo = new CPPCadesCPAlgorithmObject();
     obj->m_pCppCadesImpl = algo;
 }
@@ -15,8 +16,9 @@
 PHP_METHOD(CPAlgorithm, get_Name) {
     CADESCOM_ENCRYPTION_ALGORITHM Name;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     algo_obj *obj =
-        (algo_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (algo_obj *)((char *)zobj - XtOffsetOf(algo_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Name(&Name));
 
     RETURN_LONG(Name)
@@ -32,8 +34,9 @@
 
     Name = (CADESCOM_ENCRYPTION_ALGORITHM)lName;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     algo_obj *obj =
-        (algo_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (algo_obj *)((char *)zobj - XtOffsetOf(algo_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Name(Name));
 }
 
@@ -40,8 +43,9 @@
 PHP_METHOD(CPAlgorithm, get_KeyLength) {
     CAPICOM_ENCRYPTION_KEY_LENGTH Len;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     algo_obj *obj =
-        (algo_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (algo_obj *)((char *)zobj - XtOffsetOf(algo_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_KeyLength(&Len));
 
     RETURN_LONG(Len)
@@ -55,8 +59,9 @@
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
     Len = (CAPICOM_ENCRYPTION_KEY_LENGTH)lLen;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     algo_obj *obj =
-        (algo_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (algo_obj *)((char *)zobj - XtOffsetOf(algo_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_KeyLength(Len));
 }
 
@@ -64,39 +69,22 @@
 zend_object_handlers algo_obj_handlers;
 zend_class_entry *algo_ce;
 
-void algo_free_storage(void *object TSRMLS_DC) {
-    algo_obj *obj = (algo_obj *)object;
-    delete obj->m_pCppCadesImpl;
+static void algo_free(zend_object *object TSRMLS_DC) {
+    algo_obj *obj = (algo_obj *)((char *)object - XtOffsetOf(algo_obj, zobj));
+    delete(obj->m_pCppCadesImpl);
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value algo_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* algo_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    algo_obj *obj = (algo_obj *)emalloc(sizeof(algo_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(algo_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &algo_obj_handlers;
 
-    algo_obj *obj = (algo_obj *)emalloc(sizeof(algo_obj));
-    memset(obj, 0, sizeof(algo_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, algo_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &algo_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -104,8 +92,9 @@
     PHP_ME(CPAlgorithm, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
     PHP_ME(CPAlgorithm, get_Name, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPAlgorithm, set_Name, NULL, ZEND_ACC_PUBLIC)
-    PHP_ME(CPAlgorithm, get_KeyLength, NULL, ZEND_ACC_PUBLIC) PHP_ME(
-        CPAlgorithm, set_KeyLength, NULL, ZEND_ACC_PUBLIC){NULL, NULL, NULL}};
+    PHP_ME(CPAlgorithm, get_KeyLength, NULL, ZEND_ACC_PUBLIC)
+    PHP_ME(CPAlgorithm, set_KeyLength, NULL, ZEND_ACC_PUBLIC)
+    {NULL, NULL, NULL}};
 
 void algo_init(TSRMLS_D) {
     zend_class_entry ce;
@@ -115,4 +104,6 @@
     memcpy(&algo_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     algo_obj_handlers.clone_obj = NULL;
+    algo_obj_handlers.free_obj = algo_free;
+    algo_obj_handlers.offset = XtOffsetOf(algo_obj, zobj);
 }
Index: PHPCadesCPAlgorithm.h
===================================================================
--- PHPCadesCPAlgorithm.h	(revision 161471)
+++ PHPCadesCPAlgorithm.h	(working copy)
@@ -5,21 +5,21 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct algo_obj {
-    zend_object zo;
+typedef struct _algo_obj {
     CryptoPro::PKI::CAdES::CPPCadesCPAlgorithmObject *m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} algo_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers algo_obj_handlers;
 extern zend_class_entry *algo_ce;
 
-//функция освобождения памяти. используется при уничтожении объектов
-void algo_free_storage(void *object TSRMLS_DC);
+// //функция освобождения памяти. используется при уничтожении объектов
+// void algo_free_storage(void *object TSRMLS_DC);
 
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value algo_create_handler(zend_class_entry *type TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value algo_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPAttribute.cpp
===================================================================
--- PHPCadesCPAttribute.cpp	(revision 161471)
+++ PHPCadesCPAttribute.cpp	(working copy)
@@ -5,8 +5,9 @@
 
 //Методы
 PHP_METHOD(CPAttribute, __construct) {
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
     boost::shared_ptr<CPPCadesCPAttributeObject> ptr(
         new CPPCadesCPAttributeObject());
     obj->m_pCppCadesImpl = ptr;
@@ -16,22 +17,26 @@
     char *str;
     int len;
 
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
-
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
+
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_OID(CAtlStringA(str)));
 }
 
 PHP_METHOD(CPAttribute, get_OID) {
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
 
     object_init_ex(return_value, oid_ce);
+    zobj = Z_OBJ_P(return_value);
     oid_obj *oobj =
-        (oid_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
     oobj->m_pCppCadesImpl =
         boost::shared_ptr<CPPCadesCPOIDObject>(new CPPCadesCPOIDObject());
     boost::shared_ptr<CPPCadesCPOIDObject> ptr(new CPPCadesCPOIDObject());
@@ -44,14 +49,16 @@
     CryptoPro::CBlob val;
     CADESCOM_ATTRIBUTE Name;
     unsigned char *str;
-    unsigned int len;
+    size_t len;
 
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
-
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
+
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
+
     val.assign(str, len);
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Name(&Name));
 
@@ -70,12 +77,12 @@
 PHP_METHOD(CPAttribute, get_Value) {
     CryptoPro::CBlob val;
     BYTE *str;
-    char *tstr;
     DWORD len;
     CADESCOM_ATTRIBUTE Name;
 
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Name(&Name));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Value(val));
@@ -94,22 +101,25 @@
                           &fTimeSize);
         CryptoPro::CDateTime Time(fTime);
         CryptoPro::CStringProxy prstr = Time.tostring();
-        tstr = const_cast<char *>(prstr.c_str());
-        RETURN_STRING(tstr, 1)
+        zend_string *tstr = zend_string_init(const_cast<char *>(prstr.c_str()), strlen(prstr.c_str()), 0);
+        RETURN_NEW_STR(tstr);
     }
-    RETURN_STRINGL(reinterpret_cast<char *>(str), len, 0)
+    RETURN_STRINGL(reinterpret_cast<char *>(str), len)
 }
 
 PHP_METHOD(CPAttribute, set_Name) {
     long lname;
     CADESCOM_ATTRIBUTE name;
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lname) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
+
+
     name = (CADESCOM_ATTRIBUTE)lname;
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Name(name));
@@ -117,8 +127,9 @@
 
 PHP_METHOD(CPAttribute, get_Name) {
     CADESCOM_ATTRIBUTE name;
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Name(&name));
 
@@ -128,14 +139,14 @@
 PHP_METHOD(CPAttribute, set_ValueEncoding) {
     long lType;
     CAPICOM_ENCODING_TYPE Type;
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
-
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lType) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
     Type = (CAPICOM_ENCODING_TYPE)lType;
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_ValueEncoding(Type));
 }
@@ -142,8 +153,9 @@
 
 PHP_METHOD(CPAttribute, get_ValueEncoding) {
     CAPICOM_ENCODING_TYPE type;
-    attr_obj *obj =
-        (attr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attribute_obj *obj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ValueEncoding(&type));
 
@@ -151,42 +163,25 @@
 }
 
 //Вспомогательные функции обертки
-zend_object_handlers attr_obj_handlers;
-zend_class_entry *attr_ce;
+zend_object_handlers attribute_obj_handlers;
+zend_class_entry *attribute_ce;
 
-void attr_free_storage(void *object TSRMLS_DC) {
-    attr_obj *obj = (attr_obj *)object;
+static void attribute_free(zend_object *object) {
+    attribute_obj *obj = (attribute_obj *)((char *)object - XtOffsetOf(attribute_obj, zobj));;
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value attr_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* attribute_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    attribute_obj *obj = (attribute_obj *)emalloc(sizeof(attribute_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(attribute_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &attribute_obj_handlers;
 
-    attr_obj *obj = (attr_obj *)emalloc(sizeof(attr_obj));
-    memset(obj, 0, sizeof(attr_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, attr_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &attr_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -205,9 +200,11 @@
 void attr_init(TSRMLS_D) {
     zend_class_entry ce;
     INIT_CLASS_ENTRY(ce, "CPAttribute", attr_methods);
-    attr_ce = zend_register_internal_class(&ce TSRMLS_CC);
-    attr_ce->create_object = attr_create_handler;
-    memcpy(&attr_obj_handlers, zend_get_std_object_handlers(),
+    attribute_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    attribute_ce->create_object = attribute_create_handler;
+    memcpy(&attribute_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    attr_obj_handlers.clone_obj = NULL;
+    attribute_obj_handlers.clone_obj = NULL;
+    attribute_obj_handlers.free_obj = attribute_free;
+    attribute_obj_handlers.offset = XtOffsetOf(attribute_obj, zobj);
 }
Index: PHPCadesCPAttribute.h
===================================================================
--- PHPCadesCPAttribute.h	(revision 161471)
+++ PHPCadesCPAttribute.h	(working copy)
@@ -5,17 +5,17 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct attr_obj {
-    zend_object zo;
+typedef struct _attribute_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPAttributeObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} attribute_obj;
 
-extern zend_object_handlers attr_obj_handlers;
-extern zend_class_entry *attr_ce;
+extern zend_object_handlers attribute_obj_handlers;
+extern zend_class_entry *attribute_ce;
 
-void attr_free_storage(void *object TSRMLS_DC);
-zend_object_value attr_create_handler(zend_class_entry *type TSRMLS_DC);
+// // void attr_free_storage(void *object TSRMLS_DC);
+// zend_object_value attr_create_handler(zend_class_entry *type TSRMLS_DC);
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
 void attr_init(TSRMLS_D);
Index: PHPCadesCPAttributes.cpp
===================================================================
--- PHPCadesCPAttributes.cpp	(revision 161471)
+++ PHPCadesCPAttributes.cpp	(working copy)
@@ -5,8 +5,9 @@
 
 //Методы
 PHP_METHOD(CPAttributes, __construct) {
-    attr_col *obj =
-        (attr_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attributes_col_obj *obj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
     boost::shared_ptr<CPPCadesCPAttributesObject> ptr(
         new CPPCadesCPAttributesObject());
     obj->m_pCppCadesImpl = ptr;
@@ -14,20 +15,24 @@
 
 PHP_METHOD(CPAttributes, Add) {
     zval *item;
-    attr_col *obj =
-        (attr_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attributes_col_obj *obj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &item,
                               obj->type) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    attr_obj *iobj = (attr_obj *)zend_object_store_get_object(item TSRMLS_CC);
+    zobj = Z_OBJ_P(item);
+    attribute_obj *iobj = 
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Add(iobj->m_pCppCadesImpl));
 }
 
 PHP_METHOD(CPAttributes, get_Count) {
     long count;
-    attr_col *obj =
-        (attr_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attributes_col_obj *obj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Count(&count));
 
@@ -39,12 +44,14 @@
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &idx) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    attr_col *obj =
-        (attr_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attributes_col_obj *obj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
 
-    object_init_ex(return_value, attr_ce);
-    attr_obj *aobj =
-        (attr_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+    object_init_ex(return_value, attribute_ce);
+    zobj = Z_OBJ_P(return_value);
+    attribute_obj *aobj =
+        (attribute_obj *)((char *)zobj - XtOffsetOf(attribute_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_Item(idx, aobj->m_pCppCadesImpl));
@@ -51,8 +58,9 @@
 }
 
 PHP_METHOD(CPAttributes, Clear) {
-    attr_col *obj =
-        (attr_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attributes_col_obj *obj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Clear());
 }
 
@@ -62,8 +70,9 @@
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &idx) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    attr_col *obj =
-        (attr_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attributes_col_obj *obj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Remove(idx));
 }
 
@@ -70,57 +79,45 @@
 PHP_METHOD(CPAttributes, Assign) {
     zval *attrs;
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &attrs,
-                              attr_col_ce) == FAILURE)
+                              attributes_col_ce) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    attr_col *obj =
-        (attr_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
-    attr_col *aobj = (attr_col *)zend_object_store_get_object(attrs TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    attributes_col_obj *obj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
+
+    zobj = Z_OBJ_P(attrs);
+    attributes_col_obj *aobj = 
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Assign(
         aobj->m_pCppCadesImpl->get_CryptAttributesStruct()));
 }
 
 //Вспомогательные функции обертки
-zend_class_entry *attr_col_ce;
-zend_object_handlers attr_col_handlers;
+zend_class_entry *attributes_col_ce;
+zend_object_handlers attributes_col_obj_handlers;
 
-void attr_col_free_storage(void *object TSRMLS_DC) {
-    attr_col *obj = (attr_col *)object;
+static void attributes_col_obj_free(zend_object *object TSRMLS_DC) {
+    attributes_col_obj *obj = (attributes_col_obj *)((char *)object - XtOffsetOf(attributes_col_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value attr_col_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* attributes_col_obj_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    attributes_col_obj *obj = (attributes_col_obj *)emalloc(sizeof(attributes_col_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(attributes_col_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &attributes_col_obj_handlers;
 
-    attr_col *obj = (attr_col *)emalloc(sizeof(attr_col));
-    memset(obj, 0, sizeof(attr_col));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(obj, NULL, attr_col_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &attr_col_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
-zend_function_entry attr_col_methods[] = {
+zend_function_entry attributes_col_obj_methods[] = {
     PHP_ME(CPAttributes, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
     PHP_ME(CPAttributes, Add, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPAttributes, get_Count, NULL, ZEND_ACC_PUBLIC)
@@ -131,10 +128,12 @@
 
 void attr_col_init(TSRMLS_D) {
     zend_class_entry ce;
-    INIT_CLASS_ENTRY(ce, "CPAttributes", attr_col_methods);
-    attr_col_ce = zend_register_internal_class(&ce TSRMLS_CC);
-    attr_col_ce->create_object = attr_col_create_handler;
-    memcpy(&attr_col_handlers, zend_get_std_object_handlers(),
+    INIT_CLASS_ENTRY(ce, "CPAttributes", attributes_col_obj_methods);
+    attributes_col_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    attributes_col_ce->create_object = attributes_col_obj_create_handler;
+    memcpy(&attributes_col_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    attr_col_handlers.clone_obj = NULL;
+    attributes_col_obj_handlers.clone_obj = NULL;
+    attributes_col_obj_handlers.free_obj = attributes_col_obj_free;
+    attributes_col_obj_handlers.offset = XtOffsetOf(attributes_col_obj, zobj);
 }
Index: PHPCadesCPAttributes.h
===================================================================
--- PHPCadesCPAttributes.h	(revision 161471)
+++ PHPCadesCPAttributes.h	(working copy)
@@ -5,17 +5,17 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct attr_col {
-    zend_object zo;
+typedef struct _attributes_col_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPAttributesObject> m_pCppCadesImpl;
     zend_class_entry *type;
-};
+    zend_object zobj; /* MUST be the last element */
+} attributes_col_obj;
 
-extern zend_class_entry *attr_col_ce;
-extern zend_object_handlers attr_col_handlers;
+extern zend_class_entry *attributes_col_ce;
+extern zend_object_handlers attributes_col_obj_handlers;
 
-void attr_col_free_storage(void *object TSRMLS_DC);
-zend_object_value attr_col_create_handler(zend_class_entry *type TSRMLS_DC);
+// void attr_col_free_storage(void *object TSRMLS_DC);
+// zend_object_value attr_col_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPBasicConstraints.cpp
===================================================================
--- PHPCadesCPBasicConstraints.cpp	(revision 161471)
+++ PHPCadesCPBasicConstraints.cpp	(working copy)
@@ -3,8 +3,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPBasicConstraints, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPBasicConstraintsObject>(
         new CPPCadesCPBasicConstraintsObject());
 }
@@ -12,8 +13,9 @@
 PHP_METHOD(CPBasicConstraints, set_IsPresent) {
     long lpr;
     BOOL pr;
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lpr) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
@@ -25,8 +27,9 @@
 
 PHP_METHOD(CPBasicConstraints, get_IsPresent) {
     BOOL pr;
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsPresent(&pr));
 
@@ -36,8 +39,9 @@
 PHP_METHOD(CPBasicConstraints, set_IsCritical) {
     long lcr;
     BOOL cr;
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lcr) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
@@ -49,8 +53,9 @@
 
 PHP_METHOD(CPBasicConstraints, get_IsCritical) {
     BOOL cr;
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsCritical(&cr));
 
@@ -59,8 +64,9 @@
 
 PHP_METHOD(CPBasicConstraints, get_IsCertificateAuthority) {
     BOOL ca;
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsCertificateAuthority(&ca));
 
@@ -69,8 +75,9 @@
 
 PHP_METHOD(CPBasicConstraints, get_IsPathLenConstraintPresent) {
     BOOL plcp;
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_IsPathLenConstraintPresent(&plcp));
@@ -80,8 +87,9 @@
 
 PHP_METHOD(CPBasicConstraints, get_PathLenConstraint) {
     DWORD plc;
+    zend_object *zobj = Z_OBJ_P(getThis());
     basic_constr_obj *obj =
-        (basic_constr_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_PathLenConstraint(&plc));
 
@@ -92,41 +100,22 @@
 zend_object_handlers basic_constr_obj_handlers;
 zend_class_entry *basic_constr_ce;
 
-void basic_constr_free_storage(void *object TSRMLS_DC) {
-    basic_constr_obj *obj = (basic_constr_obj *)object;
+static void basic_constr_free(zend_object *object) {
+    basic_constr_obj *obj = (basic_constr_obj *)((char *)object - XtOffsetOf(basic_constr_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value basic_constr_create_handler(zend_class_entry *type
-                                                  TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* basic_constr_create_handler(zend_class_entry *ce) {
+    basic_constr_obj *obj = (basic_constr_obj *)emalloc(sizeof(basic_constr_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(basic_constr_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &basic_constr_obj_handlers;
 
-    basic_constr_obj *obj =
-        (basic_constr_obj *)emalloc(sizeof(basic_constr_obj));
-    memset(obj, 0, sizeof(basic_constr_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(obj, NULL, basic_constr_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &basic_constr_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -150,4 +139,6 @@
     memcpy(&basic_constr_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     basic_constr_obj_handlers.clone_obj = NULL;
+    basic_constr_obj_handlers.free_obj = basic_constr_free;
+    basic_constr_obj_handlers.offset = XtOffsetOf(basic_constr_obj, zobj);
 }
Index: PHPCadesCPBasicConstraints.h
===================================================================
--- PHPCadesCPBasicConstraints.h	(revision 161471)
+++ PHPCadesCPBasicConstraints.h	(working copy)
@@ -5,11 +5,11 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct basic_constr_obj {
-    zend_object zo;
+typedef struct _basic_constr_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPBasicConstraintsObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} basic_constr_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers basic_constr_obj_handlers;
@@ -16,10 +16,10 @@
 extern zend_class_entry *basic_constr_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void basic_constr_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value basic_constr_create_handler(zend_class_entry *type TSRMLS_DC);
+// void basic_constr_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value basic_constr_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPCardholderData.cpp
===================================================================
--- PHPCadesCPCardholderData.cpp	(revision 161471)
+++ PHPCadesCPCardholderData.cpp	(working copy)
@@ -4,7 +4,9 @@
 
 PHP_METHOD(CPCardholderData, __construct) {
     CPPCadesCardholderDataObject *chd;
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     chd = new CPPCadesCardholderDataObject();
     obj->m_pCppCadesImpl = chd;
 }
@@ -12,7 +14,9 @@
 PHP_METHOD(CPCardholderData, get_SocialAccountNumber) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_SocialAccountNumber(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -21,7 +25,9 @@
 PHP_METHOD(CPCardholderData, get_OMSNumber) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_OMSNumber(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -30,7 +36,9 @@
 PHP_METHOD(CPCardholderData, get_Name) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Name(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -39,7 +47,9 @@
 PHP_METHOD(CPCardholderData, get_FirstName) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_FirstName(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -48,7 +58,9 @@
 PHP_METHOD(CPCardholderData, get_LastName) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_LastName(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -57,7 +69,9 @@
 PHP_METHOD(CPCardholderData, get_SecondName) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_SecondName(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -66,7 +80,9 @@
 PHP_METHOD(CPCardholderData, get_CardIssuerAddress) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_CardIssuerAddress(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -75,7 +91,9 @@
 PHP_METHOD(CPCardholderData, get_DateOfBirth) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_DateOfBirth(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -84,7 +102,9 @@
 PHP_METHOD(CPCardholderData, get_PlaceOfBirth) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_PlaceOfBirth(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -93,7 +113,9 @@
 PHP_METHOD(CPCardholderData, get_SexString) {
     CAtlString atlstr;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_SexString(atlstr));
 
     RETURN_ATL_STRING(atlstr)
@@ -102,7 +124,9 @@
 PHP_METHOD(CPCardholderData, get_Sex) {
     CADESCOM_HUMAN_SEXES sex;
 
-    chd_obj *obj = (chd_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    chd_obj *obj =
+        (chd_obj *)((char *)zobj - XtOffsetOf(chd_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Sex(&sex));
 
     RETURN_LONG(sex)
@@ -111,39 +135,22 @@
 zend_object_handlers chd_obj_handlers;
 zend_class_entry *chd_ce;
 
-void chd_free_storage(void *object TSRMLS_DC) {
-    chd_obj *obj = (chd_obj *)object;
-    delete obj->m_pCppCadesImpl;
+static void chd_free(zend_object *object TSRMLS_DC) {
+    chd_obj *obj = (chd_obj *)((char *)object - XtOffsetOf(chd_obj, zobj));
+    delete(obj->m_pCppCadesImpl);
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value chd_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* chd_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    chd_obj *obj = (chd_obj *)emalloc(sizeof(chd_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(chd_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &chd_obj_handlers;
 
-    chd_obj *obj = (chd_obj *)emalloc(sizeof(chd_obj));
-    memset(obj, 0, sizeof(chd_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, chd_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &chd_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -169,4 +176,6 @@
     memcpy(&chd_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     chd_obj_handlers.clone_obj = NULL;
+    chd_obj_handlers.free_obj = chd_free;
+    chd_obj_handlers.offset = XtOffsetOf(chd_obj, zobj);
 }
Index: PHPCadesCPCardholderData.h
===================================================================
--- PHPCadesCPCardholderData.h	(revision 161471)
+++ PHPCadesCPCardholderData.h	(working copy)
@@ -5,10 +5,10 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct chd_obj {
-    zend_object zo;
+typedef struct _chd_obj {
     CryptoPro::PKI::CAdES::CPPCadesCardholderDataObject *m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} chd_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers chd_obj_handlers;
@@ -15,10 +15,10 @@
 extern zend_class_entry *chd_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void chd_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value chd_create_handler(zend_class_entry *type TSRMLS_DC);
+// void chd_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value chd_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPCertificate.cpp
===================================================================
--- PHPCadesCPCertificate.cpp	(revision 161471)
+++ PHPCadesCPCertificate.cpp	(working copy)
@@ -11,8 +11,9 @@
 
 //Методы
 PHP_METHOD(CPCertificate, __construct) {
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
     boost::shared_ptr<CPPCadesCPCertificateObject> cert(
         new CPPCadesCPCertificateObject());
     obj->m_pCppCadesImpl = cert;
@@ -29,8 +30,9 @@
 
     Type = (CAPICOM_CERT_INFO_TYPE)lType;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->GetInfo(Type, infoW));
 
     RETURN_ATL_STRING(infoW);
@@ -37,7 +39,7 @@
 }
 
 PHP_METHOD(CPCertificate, FindPrivateKey) {
-    int len;
+    size_t len;
     char *str;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &str, &len) ==
@@ -45,8 +47,9 @@
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
     }
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->FindPrivateKey(CAtlString(str, len)));
 }
@@ -54,8 +57,9 @@
 PHP_METHOD(CPCertificate, HasPrivateKey) {
     BOOL has;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->HasPrivateKey(&has));
     if (has)
@@ -68,35 +72,41 @@
     boost::shared_ptr<CPPCadesCPCertificateStatusObject> stat(
         new CPPCadesCPCertificateStatusObject());
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->IsValid(stat));
 
     object_init_ex(return_value, certstat_ce);
+    zobj = Z_OBJ_P(return_value);
     certstat_obj *cstat =
-        (certstat_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
     cstat->m_pCppCadesImpl = stat;
 }
 
 PHP_METHOD(CPCertificate, KeyUsage) {
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     object_init_ex(return_value, ku_ce);
+    zobj = Z_OBJ_P(return_value);
     ku_obj *kobj =
-        (ku_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->KeyUsage(kobj->m_pCppCadesImpl));
 }
 
 PHP_METHOD(CPCertificate, ExtendedKeyUsage) {
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     object_init_ex(return_value, exku_ce);
+    zobj = Z_OBJ_P(return_value);
     exku_obj *exkobj =
-        (exku_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (exku_obj *)((char *)zobj - XtOffsetOf(exku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->ExtendedKeyUsage(exkobj->m_pCppCadesImpl));
@@ -116,8 +126,9 @@
 
     Type = (CAPICOM_ENCODING_TYPE)lType;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Export(Type, value));
 
@@ -125,12 +136,12 @@
     str = (char *)ecalloc(len, sizeof(char));
     memcpy(str, value.pbData(), len);
 
-    RETURN_STRINGL(str, len - 2 , 0); //удаляем перевод строки иначе php будет мусор оставлять в переменных
+    RETURN_STRINGL(str, len - 2); //удаляем перевод строки иначе php будет мусор оставлять в переменных
 }
 
 PHP_METHOD(CPCertificate, Import) {
     CryptoPro::CBlob value;
-    int len;
+    size_t len;
     char *str;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
@@ -140,8 +151,9 @@
 
     value.assign((unsigned char *)str, len);
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Import(value));
 }
@@ -149,8 +161,9 @@
 PHP_METHOD(CPCertificate, get_SerialNumber) {
     CAtlString numberW;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_SerialNumber(numberW));
     RETURN_ATL_STRING(numberW)
@@ -159,8 +172,9 @@
 PHP_METHOD(CPCertificate, get_Thumbprint) {
     CAtlString thumbprW;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Thumbprint(thumbprW));
     RETURN_ATL_STRING(thumbprW)
@@ -169,8 +183,9 @@
 PHP_METHOD(CPCertificate, get_SubjectName) {
     CAtlString nameW;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_SubjectName(nameW));
     RETURN_ATL_STRING(nameW)
@@ -179,8 +194,9 @@
 PHP_METHOD(CPCertificate, get_IssuerName) {
     CAtlString nameW;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IssuerName(nameW));
     RETURN_ATL_STRING(nameW)
@@ -189,8 +205,9 @@
 PHP_METHOD(CPCertificate, get_Version) {
     DWORD version;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Version(&version));
     RETURN_LONG(version)
@@ -200,8 +217,9 @@
     CryptoPro::CDateTime date;
     CryptoPro::CStringProxy strpr;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ValidToDate(date));
     strpr = date.tostring();
@@ -212,8 +230,9 @@
     CryptoPro::CDateTime date;
     CryptoPro::CStringProxy strpr;
 
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ValidFromDate(date));
     strpr = date.tostring();
@@ -221,12 +240,14 @@
 }
 
 PHP_METHOD(CPCertificate, PrivateKey) {
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     object_init_ex(return_value, private_key_ce);
+    zobj = Z_OBJ_P(return_value);
     private_key_obj *kobj =
-        (private_key_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (private_key_obj *)((char *)zobj - XtOffsetOf(private_key_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->PrivateKey(kobj->m_pCppCadesImpl));
@@ -233,12 +254,14 @@
 }
 
 PHP_METHOD(CPCertificate, PublicKey) {
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     object_init_ex(return_value, public_key_ce);
+    zobj = Z_OBJ_P(return_value);
     public_key_obj *kobj =
-        (public_key_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (public_key_obj *)((char *)zobj - XtOffsetOf(public_key_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->PublicKey(kobj->m_pCppCadesImpl));
@@ -245,12 +268,13 @@
 }
 
 PHP_METHOD(CPCertificate, BasicConstraints) {
-    cert_obj *obj =
-        (cert_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    certificate_obj *obj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     object_init_ex(return_value, basic_constr_ce);
-    basic_constr_obj *bcobj = (basic_constr_obj *)zend_object_store_get_object(
-        return_value TSRMLS_CC);
+    zobj = Z_OBJ_P(return_value);
+    basic_constr_obj *bcobj = (basic_constr_obj *)((char *)zobj - XtOffsetOf(basic_constr_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->BasicConstraints(bcobj->m_pCppCadesImpl));
@@ -257,42 +281,25 @@
 }
 
 //Вспомогательные функции обертки
-zend_object_handlers cert_obj_handlers;
+zend_object_handlers certificate_obj_handlers;
 zend_class_entry *cert_ce;
 
-void cert_free_storage(void *object TSRMLS_DC) {
-    cert_obj *obj = (cert_obj *)object;
+static void cert_free(zend_object *object TSRMLS_DC) {
+    certificate_obj *obj = (certificate_obj *)((char *)object - XtOffsetOf(certificate_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value cert_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* cert_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    certificate_obj *obj = (certificate_obj *)emalloc(sizeof(certificate_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(certificate_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &certificate_obj_handlers;
 
-    cert_obj *obj = (cert_obj *)emalloc(sizeof(cert_obj));
-    memset(obj, 0, sizeof(cert_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, cert_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &cert_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -319,10 +326,12 @@
 
 void cert_init(TSRMLS_D) {
     zend_class_entry ce;
-    INIT_CLASS_ENTRY(ce, "CPcertificate", cert_methods);
+    INIT_CLASS_ENTRY(ce, "CPCertificate", cert_methods);
     cert_ce = zend_register_internal_class(&ce TSRMLS_CC);
     cert_ce->create_object = cert_create_handler;
-    memcpy(&cert_obj_handlers, zend_get_std_object_handlers(),
+    memcpy(&certificate_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    cert_obj_handlers.clone_obj = NULL;
+    certificate_obj_handlers.clone_obj = NULL;
+    certificate_obj_handlers.free_obj = cert_free;
+    certificate_obj_handlers.offset = XtOffsetOf(certificate_obj, zobj);
 }
Index: PHPCadesCPCertificate.h
===================================================================
--- PHPCadesCPCertificate.h	(revision 161471)
+++ PHPCadesCPCertificate.h	(working copy)
@@ -5,17 +5,16 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct cert_obj {
-    zend_object zo;
+typedef struct _certificate_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPCertificateObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} certificate_obj;
 
-extern zend_object_handlers cert_obj_handlers;
+extern zend_object_handlers certificate_obj_handlers;
 extern zend_class_entry *cert_ce;
 
-void cert_free_storage(void *object TSRMLS_DC);
-zend_object_value cert_create_handler(zend_class_entry *type TSRMLS_DC);
+// zend_object* cert_create_handler(zend_class_entry *ce TSRMLS_DC);
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
 void cert_init(TSRMLS_D);
Index: PHPCadesCPCertificateStatus.cpp
===================================================================
--- PHPCadesCPCertificateStatus.cpp	(revision 161471)
+++ PHPCadesCPCertificateStatus.cpp	(working copy)
@@ -6,8 +6,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPCertificateStatus, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPCertificateStatusObject>(
         new CPPCadesCPCertificateStatusObject());
 }
@@ -14,8 +15,9 @@
 
 PHP_METHOD(CPCertificateStatus, get_Result) {
     BOOL res;
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Result(&res));
 
@@ -24,8 +26,9 @@
 
 PHP_METHOD(CPCertificateStatus, get_CheckFlag) {
     CAPICOM_CHECK_FLAG flag;
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_CheckFlag(&flag));
 
@@ -35,8 +38,10 @@
 PHP_METHOD(CPCertificateStatus, set_CheckFlag) {
     long lFlag;
     CAPICOM_CHECK_FLAG Flag;
+
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lFlag) ==
         FAILURE)
@@ -49,14 +54,17 @@
 
 PHP_METHOD(CPCertificateStatus, EKU) {
     boost::shared_ptr<CPPCadesCPEKUObject> ptr(new CPPCadesCPEKUObject());
+
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->EKU(ptr));
 
     object_init_ex(return_value, eku_ce);
+    zobj = Z_OBJ_P(return_value);
     eku_obj *eobj =
-        (eku_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (eku_obj *)((char *)zobj - XtOffsetOf(eku_obj, zobj));
 
     eobj->m_pCppCadesImpl = ptr;
 }
@@ -65,8 +73,9 @@
     CryptoPro::CDateTime time;
     CryptoPro::CStringProxy strpr;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_VerificationTime(time));
 
@@ -77,10 +86,11 @@
 PHP_METHOD(CPCertificateStatus, set_VerificationTime) {
     CryptoPro::CDateTime time;
     char *str;
-    int len;
+    size_t len;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
@@ -97,8 +107,9 @@
 PHP_METHOD(CPCertificateStatus, set_UrlRetrievalTimeout) {
     long urt;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &urt) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
@@ -109,8 +120,9 @@
 PHP_METHOD(CPCertificateStatus, get_UrlRetrievalTimeout) {
     long urt;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_UrlRetrievalTimeout(&urt));
 
@@ -123,8 +135,9 @@
     unsigned int count;
     zval *CPoid = new zval();
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->CertificatePolicies(oids));
     HR_ERRORCHECK_RETURN(oids->get_Count(&count));
@@ -134,7 +147,8 @@
 
     for (unsigned int i = 1; i <= count; i++) {
         HR_ERRORCHECK_RETURN(oids->get_Item(i, oid));
-        oid_obj *arg = (oid_obj *)zend_object_store_get_object(CPoid TSRMLS_CC);
+        zobj = Z_OBJ_P(CPoid);
+        oid_obj *arg = (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
         arg->m_pCppCadesImpl = oid;
         add_next_index_zval(CPoid, return_value);
     }
@@ -146,8 +160,9 @@
     unsigned int count;
     zval *CPoid = new zval();
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->ApplicationPolicies(oids));
     HR_ERRORCHECK_RETURN(oids->get_Count(&count));
@@ -157,7 +172,8 @@
 
     for (unsigned int i = 1; i <= count; i++) {
         HR_ERRORCHECK_RETURN(oids->get_Item(i, oid));
-        oid_obj *arg = (oid_obj *)zend_object_store_get_object(CPoid TSRMLS_CC);
+        zobj = Z_OBJ_P(CPoid);
+        oid_obj *arg = (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
         arg->m_pCppCadesImpl = oid;
         add_next_index_zval(CPoid, return_value);
     }
@@ -167,15 +183,17 @@
     boost::shared_ptr<CPPCadesCPCertificatesObject> certs(
         new CPPCadesCPCertificatesObject());
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certstat_obj *obj =
-        (certstat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certstat_obj *)((char *)zobj - XtOffsetOf(certstat_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_ValidationCertificates(certs));
 
     object_init_ex(return_value, certs_ce);
+    zobj = Z_OBJ_P(return_value);
     certs_obj *cobj =
-        (certs_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
     cobj->m_pCppCadesImpl = certs;
 }
 
@@ -182,39 +200,22 @@
 zend_object_handlers certstat_obj_handlers;
 zend_class_entry *certstat_ce;
 
-void certstat_free_storage(void *object TSRMLS_DC) {
-    certstat_obj *obj = (certstat_obj *)object;
+static void certstat_free(zend_object *object TSRMLS_DC) {
+    certstat_obj *obj = (certstat_obj *)((char *)object - XtOffsetOf(certstat_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value certstat_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* certstat_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    certstat_obj *obj = (certstat_obj *)emalloc(sizeof(certstat_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(certstat_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &certstat_obj_handlers;
 
-    certstat_obj *obj = (certstat_obj *)emalloc(sizeof(certstat_obj));
-    memset(obj, 0, sizeof(certstat_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(obj, NULL, certstat_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &certstat_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -242,4 +243,6 @@
     memcpy(&certstat_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     certstat_obj_handlers.clone_obj = NULL;
+    certstat_obj_handlers.free_obj = certstat_free;
+    certstat_obj_handlers.offset = XtOffsetOf(certstat_obj, zobj);
 }
Index: PHPCadesCPCertificateStatus.h
===================================================================
--- PHPCadesCPCertificateStatus.h	(revision 161471)
+++ PHPCadesCPCertificateStatus.h	(working copy)
@@ -5,22 +5,22 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct certstat_obj {
-    zend_object zo;
+typedef struct _certstat_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPCertificateStatusObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} certstat_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers certstat_obj_handlers;
 extern zend_class_entry *certstat_ce;
 
-//функция освобождения памяти. используется при уничтожении объектов
-void certstat_free_storage(void *object TSRMLS_DC);
+// //функция освобождения памяти. используется при уничтожении объектов
+// void certstat_free_storage(void *object TSRMLS_DC);
 
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value certstat_create_handler(zend_class_entry *type TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value certstat_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPCertificates.cpp
===================================================================
--- PHPCadesCPCertificates.cpp	(revision 161471)
+++ PHPCadesCPCertificates.cpp	(working copy)
@@ -5,8 +5,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPCertificates, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     certs_obj *obj =
-        (certs_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPCertificatesObject>(
         new CPPCadesCPCertificatesObject());
 }
@@ -37,7 +38,7 @@
             RETURN_WITH_EXCEPTION(E_INVALIDARG);
         }
 
-        findCriteria.str = CAtlString(query->value.str.val);
+        findCriteria.str = CAtlString(query->value.str->val);
         findCriteria.dwCriteriaFlag = FIND_CRITERIA_STRING;
         break;
     }
@@ -53,7 +54,7 @@
     case CAPICOM_CERTIFICATE_FIND_EXTENSION:
     case CAPICOM_CERTIFICATE_FIND_APPLICATION_POLICY: {
         if (Z_TYPE_P(query) == IS_STRING) {
-            findCriteria.str = CAtlString(query->value.str.val);
+            findCriteria.str = CAtlString(query->value.str->val);
             findCriteria.dwCriteriaFlag = FIND_CRITERIA_STRING;
         } else {
             if (Z_TYPE_P(query) != IS_LONG) {
@@ -84,12 +85,14 @@
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
     }
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certs_obj *obj =
-        (certs_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
 
     object_init_ex(return_value, certs_ce);
+    zobj = Z_OBJ_P(return_value);
     certs_obj *cobj =
-        (certs_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Find(
         Type, &findCriteria, bValidOnly, cobj->m_pCppCadesImpl));
@@ -103,15 +106,17 @@
 
     Idx = (unsigned int)lIdx;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certs_obj *obj =
-        (certs_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
 
     boost::shared_ptr<CPPCadesCPCertificateObject> context;
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Item(Idx, context));
 
     object_init_ex(return_value, cert_ce);
-    cert_obj *cobj =
-        (cert_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+    zobj = Z_OBJ_P(return_value);
+    certificate_obj *cobj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
     cobj->m_pCppCadesImpl = context;
 }
 
@@ -118,8 +123,9 @@
 PHP_METHOD(CPCertificates, Count) {
     unsigned int count;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     certs_obj *obj =
-        (certs_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Count(&count));
 
@@ -129,39 +135,22 @@
 zend_object_handlers certs_obj_handlers;
 zend_class_entry *certs_ce;
 
-void certs_free_storage(void *object TSRMLS_DC) {
-    certs_obj *obj = (certs_obj *)object;
+static void certs_free(zend_object *object TSRMLS_DC) {
+    certs_obj *obj = (certs_obj *)((char *)object - XtOffsetOf(certs_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value certs_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* certs_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    certs_obj *obj = (certs_obj *)emalloc(sizeof(certs_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(certs_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &certs_obj_handlers;
 
-    certs_obj *obj = (certs_obj *)emalloc(sizeof(certs_obj));
-    memset(obj, 0, sizeof(certs_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, certs_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &certs_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -179,4 +168,6 @@
     memcpy(&certs_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     certs_obj_handlers.clone_obj = NULL;
+    certs_obj_handlers.free_obj = certs_free;
+    certs_obj_handlers.offset = XtOffsetOf(certs_obj, zobj);
 }
Index: PHPCadesCPCertificates.h
===================================================================
--- PHPCadesCPCertificates.h	(revision 161471)
+++ PHPCadesCPCertificates.h	(working copy)
@@ -3,11 +3,11 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct certs_obj {
-    zend_object zo;
+typedef struct _certs_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPCertificatesObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} certs_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers certs_obj_handlers;
@@ -14,11 +14,11 @@
 extern zend_class_entry *certs_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void certs_free_storage(void *object TSRMLS_DC);
+// void certs_free_storage(void *object TSRMLS_DC);
 
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value certs_create_handler(zend_class_entry *type TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value certs_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPEKU.cpp
===================================================================
--- PHPCadesCPEKU.cpp	(revision 161471)
+++ PHPCadesCPEKU.cpp	(working copy)
@@ -5,7 +5,9 @@
 //Методы
 PHP_METHOD(CPEKU, __construct) {
 
-    eku_obj *obj = (eku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_obj *obj =
+        (eku_obj *)((char *)zobj - XtOffsetOf(eku_obj, zobj));
     boost::shared_ptr<CPPCadesCPEKUObject> eku(new CPPCadesCPEKUObject());
     obj->m_pCppCadesImpl = eku;
 }
@@ -13,7 +15,9 @@
 PHP_METHOD(CPEKU, get_Name) {
     CAPICOM_EKU Name;
 
-    eku_obj *obj = (eku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_obj *obj =
+        (eku_obj *)((char *)zobj - XtOffsetOf(eku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Name(&Name));
 
@@ -24,13 +28,15 @@
     long lName;
     CAPICOM_EKU Name;
 
-    eku_obj *obj = (eku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lName) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
-
     Name = (CAPICOM_EKU)lName;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_obj *obj =
+        (eku_obj *)((char *)zobj - XtOffsetOf(eku_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Name(Name));
 }
 
@@ -37,7 +43,9 @@
 PHP_METHOD(CPEKU, get_OID) {
     CAtlStringA OID;
 
-    eku_obj *obj = (eku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_obj *obj =
+        (eku_obj *)((char *)zobj - XtOffsetOf(eku_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_OID(OID));
 
     RETURN_ATL_STRING_A(OID)
@@ -46,13 +54,15 @@
 PHP_METHOD(CPEKU, set_OID) {
     CAtlStringA OIDw;
     char *OID;
-    int len;
-
-    eku_obj *obj = (eku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    size_t len;
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &OID, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_obj *obj =
+        (eku_obj *)((char *)zobj - XtOffsetOf(eku_obj, zobj));
+
     OIDw = CAtlString(OID);
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_OID(OIDw));
 }
@@ -61,39 +71,22 @@
 zend_object_handlers eku_obj_handlers;
 zend_class_entry *eku_ce;
 
-void eku_free_storage(void *object TSRMLS_DC) {
-    eku_obj *obj = (eku_obj *)object;
+static void eku_free(zend_object *object) {
+    eku_obj *obj = (eku_obj *)((char *)object - XtOffsetOf(eku_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value eku_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* eku_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    eku_obj *obj = (eku_obj *)emalloc(sizeof(eku_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(eku_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &eku_obj_handlers;
 
-    eku_obj *obj = (eku_obj *)emalloc(sizeof(eku_obj));
-    memset(obj, 0, sizeof(eku_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, eku_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &eku_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -112,4 +105,6 @@
     memcpy(&eku_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     eku_obj_handlers.clone_obj = NULL;
+    eku_obj_handlers.free_obj = eku_free;
+    eku_obj_handlers.offset = XtOffsetOf(eku_obj, zobj);
 }
Index: PHPCadesCPEKU.h
===================================================================
--- PHPCadesCPEKU.h	(revision 161471)
+++ PHPCadesCPEKU.h	(working copy)
@@ -5,17 +5,17 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct eku_obj {
-    zend_object zo;
+typedef struct _eku_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPEKUObject> m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} eku_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers eku_obj_handlers;
 extern zend_class_entry *eku_ce;
 
-void eku_free_storage(void *object TSRMLS_DC);
-zend_object_value item_create_handler(zend_class_entry *type TSRMLS_DC);
+// void eku_free_storage(void *object TSRMLS_DC);
+// zend_object_value item_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPEKUs.cpp
===================================================================
--- PHPCadesCPEKUs.cpp	(revision 161471)
+++ PHPCadesCPEKUs.cpp	(working copy)
@@ -5,7 +5,9 @@
 
 //Методы
 PHP_METHOD(CPEKUs, __construct) {
-    eku_col *obj = (eku_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_col_obj *obj =
+        (eku_col_obj *)((char *)zobj - XtOffsetOf(eku_col_obj, zobj));
     boost::shared_ptr<CPPCadesCPEKUsObject> ptr(new CPPCadesCPEKUsObject());
     obj->m_pCppCadesImpl = ptr;
 }
@@ -12,19 +14,24 @@
 
 PHP_METHOD(CPEKUs, Add) {
     zval *item;
-    eku_col *obj = (eku_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_col_obj *obj =
+        (eku_col_obj *)((char *)zobj - XtOffsetOf(eku_col_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &item,
                               obj->type) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    eku_obj *iobj = (eku_obj *)zend_object_store_get_object(item TSRMLS_CC);
+    zobj = Z_OBJ_P(item);
+    eku_obj *iobj = (eku_obj *)((char *)item - XtOffsetOf(eku_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Add(iobj->m_pCppCadesImpl));
 }
 
 PHP_METHOD(CPEKUs, get_Count) {
     unsigned int count;
-    eku_col *obj = (eku_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_col_obj *obj =
+        (eku_col_obj *)((char *)zobj - XtOffsetOf(eku_col_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Count(&count));
 
@@ -38,19 +45,24 @@
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &idx) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    eku_col *obj = (eku_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_col_obj *obj =
+        (eku_col_obj *)((char *)zobj - XtOffsetOf(eku_col_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Item(idx, item));
     if (item == NULL)
         RETURN_WITH_EXCEPTION(ERROR_NO_MORE_ITEMS);
 
     object_init_ex(return_value, obj->type);
+    zobj = Z_OBJ_P(return_value);
     eku_obj *iobj =
-        (eku_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (eku_obj *)((char *)zobj - XtOffsetOf(eku_obj, zobj));
     iobj->m_pCppCadesImpl = item;
 }
 
 PHP_METHOD(CPEKUs, Clear) {
-    eku_col *obj = (eku_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_col_obj *obj =
+        (eku_col_obj *)((char *)zobj - XtOffsetOf(eku_col_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Clear());
 }
 
@@ -60,47 +72,32 @@
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &idx) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    eku_col *obj = (eku_col *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    eku_col_obj *obj =
+        (eku_col_obj *)((char *)zobj - XtOffsetOf(eku_col_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Remove(idx));
 }
 
 //Вспомогательные функции обертки
 zend_class_entry *eku_col_ce;
-zend_object_handlers eku_col_handlers;
+zend_object_handlers eku_col_obj_handlers;
 
-void eku_col_free_storage(void *object TSRMLS_DC) {
-    eku_col *obj = (eku_col *)object;
+static void eku_col_free(zend_object *object) {
+    eku_col_obj *obj = (eku_col_obj *)((char *)object - XtOffsetOf(eku_col_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value eku_col_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* eku_col_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    eku_col_obj *obj = (eku_col_obj *)emalloc(sizeof(eku_col_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(eku_col_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &eku_col_obj_handlers;
 
-    eku_col *obj = (eku_col *)emalloc(sizeof(eku_col));
-    memset(obj, 0, sizeof(eku_col));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, eku_col_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &eku_col_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -117,7 +114,9 @@
     INIT_CLASS_ENTRY(ce, "CPEKUs", eku_col_methods);
     eku_col_ce = zend_register_internal_class(&ce TSRMLS_CC);
     eku_col_ce->create_object = eku_col_create_handler;
-    memcpy(&eku_col_handlers, zend_get_std_object_handlers(),
+    memcpy(&eku_col_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    eku_col_handlers.clone_obj = NULL;
+    eku_col_obj_handlers.clone_obj = NULL;
+    eku_col_obj_handlers.free_obj = eku_col_free;
+    eku_col_obj_handlers.offset = XtOffsetOf(eku_col_obj, zobj);
 }
Index: PHPCadesCPEKUs.h
===================================================================
--- PHPCadesCPEKUs.h	(revision 161471)
+++ PHPCadesCPEKUs.h	(working copy)
@@ -5,17 +5,17 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct eku_col {
-    zend_object zo;
+typedef struct _eku_col_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPEKUsObject> m_pCppCadesImpl;
     zend_class_entry *type;
-};
+    zend_object zobj; /* MUST be the last element */
+} eku_col_obj;
 
 extern zend_class_entry *eku_col_ce;
 extern zend_object_handlers eku_col_handlers;
 
-void eku_col_free_storage(void *object TSRMLS_DC);
-zend_object_value eku_col_create_handler(zend_class_entry *type TSRMLS_DC);
+// void eku_col_free_storage(void *object TSRMLS_DC);
+// zend_object_value eku_col_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPEncodedData.cpp
===================================================================
--- PHPCadesCPEncodedData.cpp	(revision 161471)
+++ PHPCadesCPEncodedData.cpp	(working copy)
@@ -3,8 +3,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPEncodedData, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     encoded_data_obj *obj =
-        (encoded_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (encoded_data_obj *)((char *)zobj - XtOffsetOf(encoded_data_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPEncodedDataObject>(
         new CPPCadesCPEncodedDataObject());
 }
@@ -14,8 +15,9 @@
     long lML;
     BOOL bML;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     encoded_data_obj *obj =
-        (encoded_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (encoded_data_obj *)((char *)zobj - XtOffsetOf(encoded_data_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lML) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
@@ -34,8 +36,9 @@
     char *str;
     unsigned int len;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     encoded_data_obj *obj =
-        (encoded_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (encoded_data_obj *)((char *)zobj - XtOffsetOf(encoded_data_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lType) ==
         FAILURE)
@@ -49,47 +52,28 @@
     str = (char *)ecalloc(len, sizeof(char));
     memcpy(str, data.pbData(), len);
 
-    RETURN_STRINGL(str, len, 0)
+    RETURN_STRINGL(str, len)
 }
 
 zend_object_handlers encoded_data_obj_handlers;
 zend_class_entry *encoded_data_ce;
 
-void encoded_data_free_storage(void *object TSRMLS_DC) {
-    encoded_data_obj *obj = (encoded_data_obj *)object;
+static void encoded_data_free(zend_object *object TSRMLS_DC) {
+    encoded_data_obj *obj = (encoded_data_obj *)((char *)object - XtOffsetOf(encoded_data_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value encoded_data_create_handler(zend_class_entry *type
-                                                  TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* encoded_data_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    encoded_data_obj *obj = (encoded_data_obj *)emalloc(sizeof(encoded_data_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(encoded_data_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &encoded_data_obj_handlers;
 
-    encoded_data_obj *obj =
-        (encoded_data_obj *)emalloc(sizeof(encoded_data_obj));
-    memset(obj, 0, sizeof(encoded_data_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(obj, NULL, encoded_data_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &encoded_data_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -106,4 +90,6 @@
     memcpy(&encoded_data_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     encoded_data_obj_handlers.clone_obj = NULL;
+    encoded_data_obj_handlers.free_obj = encoded_data_free;
+    encoded_data_obj_handlers.offset = XtOffsetOf(encoded_data_obj, zobj);
 }
Index: PHPCadesCPEncodedData.h
===================================================================
--- PHPCadesCPEncodedData.h	(revision 161471)
+++ PHPCadesCPEncodedData.h	(working copy)
@@ -5,11 +5,11 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct encoded_data_obj {
-    zend_object zo;
+typedef struct _encoded_data_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPEncodedDataObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} encoded_data_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers encoded_data_obj_handlers;
@@ -16,10 +16,10 @@
 extern zend_class_entry *encoded_data_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void encoded_data_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value encoded_data_create_handler(zend_class_entry *type TSRMLS_DC);
+// void encoded_data_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value encoded_data_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPEnvelopedData.cpp
===================================================================
--- PHPCadesCPEnvelopedData.cpp	(revision 161471)
+++ PHPCadesCPEnvelopedData.cpp	(working copy)
@@ -5,8 +5,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPEnvelopedData, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
     obj->m_pCppCadesImpl = new CPPCadesCPEnvelopedDataObject();
 }
 
@@ -13,8 +14,9 @@
 PHP_METHOD(CPEnvelopedData, get_Content) {
     CStringBlob content;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Content(content));
 
@@ -23,14 +25,15 @@
 
 PHP_METHOD(CPEnvelopedData, set_Content) {
     char *str;
-    unsigned int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Content(str, len));
 }
@@ -38,8 +41,9 @@
 PHP_METHOD(CPEnvelopedData, get_ContentEncoding) {
     CADESCOM_CONTENT_ENCODING_TYPE type;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ContentEncoding(&type));
 
@@ -52,8 +56,9 @@
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &type) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_ContentEncoding(
         (CADESCOM_CONTENT_ENCODING_TYPE)type));
 }
@@ -71,8 +76,9 @@
 
     Type = (CAPICOM_ENCODING_TYPE)lType;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Encrypt(Type, data));
 
@@ -80,20 +86,21 @@
     str = (char *)ecalloc(len, sizeof(char));
     memcpy(str, data.pbData(), len);
 
-    RETURN_STRINGL(str, len, 0)
+    RETURN_STRINGL(str, len)
 }
 
 PHP_METHOD(CPEnvelopedData, Decrypt) {
     CryptoPro::CBlob data;
     unsigned char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
     data.assign(str, len);
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Decrypt(data));
@@ -100,11 +107,13 @@
 }
 
 PHP_METHOD(CPEnvelopedData, get_Recipients) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     enveloped_data_obj *obj =
-        (enveloped_data_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
-    object_init_ex(return_value, recipients_class_entry);
+        (enveloped_data_obj *)((char *)zobj - XtOffsetOf(enveloped_data_obj, zobj));
+    object_init_ex(return_value, recipients_ce);
+    zobj = Z_OBJ_P(return_value);
     recipients_obj *Recipients_ptr =
-        (recipients_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (recipients_obj *)((char *)zobj - XtOffsetOf(recipients_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_Recipients(Recipients_ptr->m_pCppCadesImpl));
@@ -113,41 +122,23 @@
 zend_object_handlers enveloped_data_obj_handlers;
 zend_class_entry *enveloped_data_ce;
 
-void enveloped_data_free_storage(void *object TSRMLS_DC) {
-    enveloped_data_obj *obj = (enveloped_data_obj *)object;
-    delete obj->m_pCppCadesImpl;
+static void enveloped_data_free(zend_object *object TSRMLS_DC) {
+    enveloped_data_obj *obj = (enveloped_data_obj *)((char *)object - XtOffsetOf(enveloped_data_obj, zobj));
+    delete(obj->m_pCppCadesImpl);
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value enveloped_data_create_handler(zend_class_entry *type
+static zend_object* enveloped_data_create_handler(zend_class_entry *ce
                                                     TSRMLS_DC) {
-    zend_object_value retval;
+    enveloped_data_obj *obj = (enveloped_data_obj *)emalloc(sizeof(enveloped_data_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(enveloped_data_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &enveloped_data_obj_handlers;
 
-    enveloped_data_obj *obj =
-        (enveloped_data_obj *)emalloc(sizeof(enveloped_data_obj));
-    memset(obj, 0, sizeof(enveloped_data_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(
-        obj, NULL, enveloped_data_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &enveloped_data_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -171,4 +162,6 @@
     memcpy(&enveloped_data_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     enveloped_data_obj_handlers.clone_obj = NULL;
+    enveloped_data_obj_handlers.free_obj = enveloped_data_free;
+    enveloped_data_obj_handlers.offset = XtOffsetOf(enveloped_data_obj, zobj);
 }
Index: PHPCadesCPEnvelopedData.h
===================================================================
--- PHPCadesCPEnvelopedData.h	(revision 161471)
+++ PHPCadesCPEnvelopedData.h	(working copy)
@@ -5,10 +5,10 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct enveloped_data_obj {
-    zend_object zo;
+typedef struct _enveloped_data_obj {
     CryptoPro::PKI::CAdES::CPPCadesCPEnvelopedDataObject *m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} enveloped_data_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers enveloped_data_obj_handlers;
@@ -15,11 +15,11 @@
 extern zend_class_entry *enveloped_data_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void enveloped_data_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value enveloped_data_create_handler(zend_class_entry *type
-                                                    TSRMLS_DC);
+// void enveloped_data_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value enveloped_data_create_handler(zend_class_entry *type
+//                                                     TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPExtendedKeyUsage.cpp
===================================================================
--- PHPCadesCPExtendedKeyUsage.cpp	(revision 161471)
+++ PHPCadesCPExtendedKeyUsage.cpp	(working copy)
@@ -5,9 +5,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPExtendedKeyUsage, __construct) {
-
+    zend_object *zobj = Z_OBJ_P(getThis());
     exku_obj *obj =
-        (exku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (exku_obj *)((char *)zobj - XtOffsetOf(exku_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPExtendedKeyUsageObject>(
         new CPPCadesCPExtendedKeyUsageObject());
 }
@@ -15,8 +15,9 @@
 PHP_METHOD(CPExtendedKeyUsage, get_IsPresent) {
     BOOL val;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     exku_obj *obj =
-        (exku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (exku_obj *)((char *)zobj - XtOffsetOf(exku_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsPresent(&val));
 
     RETURN_LONG(val)
@@ -25,8 +26,9 @@
 PHP_METHOD(CPExtendedKeyUsage, get_IsCritical) {
     BOOL val;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     exku_obj *obj =
-        (exku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (exku_obj *)((char *)zobj - XtOffsetOf(exku_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsCritical(&val));
 
     RETURN_LONG(val)
@@ -33,15 +35,17 @@
 }
 
 PHP_METHOD(CPExtendedKeyUsage, get_EKUs) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     exku_obj *obj =
-        (exku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (exku_obj *)((char *)zobj - XtOffsetOf(exku_obj, zobj));
     boost::shared_ptr<CPPCadesCPEKUsObject> ptr(new CPPCadesCPEKUsObject());
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_EKUs(ptr));
 
     object_init_ex(return_value, eku_col_ce);
-    eku_col *ekus =
-        (eku_col *)zend_object_store_get_object(return_value TSRMLS_CC);
+    zobj = Z_OBJ_P(return_value);
+    eku_col_obj *ekus =
+        (eku_col_obj *)((char *)zobj - XtOffsetOf(eku_col_obj, zobj));
 
     ekus->m_pCppCadesImpl = ptr;
     ekus->type = eku_ce;
@@ -50,39 +54,22 @@
 zend_object_handlers exku_obj_handlers;
 zend_class_entry *exku_ce;
 
-void exku_free_storage(void *object TSRMLS_DC) {
-    exku_obj *obj = (exku_obj *)object;
+static void exku_free(zend_object* object) {
+    exku_obj *obj = (exku_obj *)((char *)object - XtOffsetOf(exku_obj, zobj));;
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value exku_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* exku_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    exku_obj *obj = (exku_obj *)emalloc(sizeof(exku_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(exku_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &exku_obj_handlers;
 
-    exku_obj *obj = (exku_obj *)emalloc(sizeof(exku_obj));
-    memset(obj, 0, sizeof(exku_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, exku_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &exku_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -101,4 +88,6 @@
     memcpy(&exku_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     exku_obj_handlers.clone_obj = NULL;
+    exku_obj_handlers.free_obj = exku_free;
+    exku_obj_handlers.offset = XtOffsetOf(exku_obj, zobj);
 }
Index: PHPCadesCPExtendedKeyUsage.h
===================================================================
--- PHPCadesCPExtendedKeyUsage.h	(revision 161471)
+++ PHPCadesCPExtendedKeyUsage.h	(working copy)
@@ -5,11 +5,11 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct exku_obj {
-    zend_object zo;
+typedef struct _exku_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPExtendedKeyUsageObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} exku_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers exku_obj_handlers;
@@ -16,11 +16,11 @@
 extern zend_class_entry *exku_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void exku_free_storage(void *object TSRMLS_DC);
+// void exku_free_storage(void *object TSRMLS_DC);
 
 //функция создания хэндлера для нового объекта класса. используется при
 //создании новых объектов
-zend_object_value exku_create_handler(zend_class_entry *type TSRMLS_DC);
+// zend_object_value exku_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPHashedData.cpp
===================================================================
--- PHPCadesCPHashedData.cpp    (revision 189859)
+++ PHPCadesCPHashedData.cpp    (working copy)
@@ -3,8 +3,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPHashedData, __construct) {
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPHashedDataObject>(
         new CPPCadesCPHashedDataObject());
 }
@@ -11,20 +12,21 @@
 
 PHP_METHOD(CPHashedData, Hash) {
     char *sVal;
-    int lVal;
+    size_t lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &sVal, &lVal) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Hash(sVal, lVal));
 }
 
 PHP_METHOD(CPHashedData, SetHashValue) {
     char *sVal;
-    int lVal;
+    size_t lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &sVal, &lVal) ==
         FAILURE)
@@ -35,8 +37,9 @@
 
     CAtlString Val(sVal, lVal);
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_HashValue(Val));
 }
 
@@ -43,8 +46,9 @@
 PHP_METHOD(CPHashedData, get_Key) {
     CAtlString Val;
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+            (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Key(Val));
 
     RETURN_ATL_STRINGL(Val)
@@ -55,12 +59,14 @@
     char *Val;
     int len;
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &Val, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+            (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
+
     sVal = CAtlString(Val);
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Key(sVal));
 }
@@ -68,8 +74,9 @@
 PHP_METHOD(CPHashedData, get_Value) {
     CAtlString Val;
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Value(Val));
 
     RETURN_ATL_STRINGL(Val)
@@ -85,8 +92,9 @@
 
     Algorithm = (CAPICOM_HASH_ALGORITHM)lAlgorithm;
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Algorithm(Algorithm));
 }
 
@@ -93,8 +101,9 @@
 PHP_METHOD(CPHashedData, get_Algorithm) {
     CAPICOM_HASH_ALGORITHM Algorithm;
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Algorithm(&Algorithm));
 
     RETURN_LONG(Algorithm)
@@ -110,8 +119,9 @@
 
     Type = (CADESCOM_CONTENT_ENCODING_TYPE)lType;
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_DataEncoding(Type));
 }
 
@@ -118,17 +128,18 @@
 PHP_METHOD(CPHashedData, get_DataEncoding) {
     CADESCOM_CONTENT_ENCODING_TYPE type;
 
-    hash_dat_obj *obj =
-        (hash_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    hashed_data_obj *obj =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_DataEncoding(&type));
 
     RETURN_LONG(type)
 }
 
-zend_class_entry *hash_dat_class_entry;
-zend_object_handlers hash_dat_handlers;
+zend_class_entry *hashed_data_ce;
+zend_object_handlers hashed_data_obj_handlers;
 
-zend_function_entry hash_dat_methods[] = {
+zend_function_entry hashed_data_methods[] = {
     PHP_ME(CPHashedData, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
     PHP_ME(CPHashedData, Hash, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPHashedData, SetHashValue, NULL, ZEND_ACC_PUBLIC)
@@ -141,47 +152,32 @@
     PHP_ME(CPHashedData, get_DataEncoding, NULL, ZEND_ACC_PUBLIC){NULL, NULL,
                                                                   NULL}};
 
-void hash_dat_free_storage(void *object TSRMLS_DC) {
-    hash_dat_obj *obj = (hash_dat_obj *)object;
+static void hashed_data_free(zend_object *object TSRMLS_DC) {
+    hashed_data_obj *obj = (hashed_data_obj *)((char *)object - XtOffsetOf(hashed_data_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value hash_dat_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* hashed_data_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    hashed_data_obj *obj = (hashed_data_obj *)emalloc(sizeof(hashed_data_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(hashed_data_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &hashed_data_obj_handlers;
 
-    hash_dat_obj *obj = (hash_dat_obj *)emalloc(sizeof(hash_dat_obj));
-    memset(obj, 0, sizeof(hash_dat_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(obj, NULL, hash_dat_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &hash_dat_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
-void hash_dat_init(TSRMLS_D) {
+void hashed_data_init(TSRMLS_D) {
     zend_class_entry ce;
-    INIT_CLASS_ENTRY(ce, "CPHashedData", hash_dat_methods);
-    hash_dat_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
-    hash_dat_class_entry->create_object = hash_dat_create_handler;
-    memcpy(&hash_dat_handlers, zend_get_std_object_handlers(),
+    INIT_CLASS_ENTRY(ce, "CPHashedData", hashed_data_methods);
+    hashed_data_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    hashed_data_ce->create_object = hashed_data_create_handler;
+    memcpy(&hashed_data_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    hash_dat_handlers.clone_obj = NULL;
+    hashed_data_obj_handlers.clone_obj = NULL;
+    hashed_data_obj_handlers.free_obj = hashed_data_free;
+    hashed_data_obj_handlers.offset = XtOffsetOf(hashed_data_obj, zobj);
 }
Index: PHPCadesCPHashedData.h
===================================================================
--- PHPCadesCPHashedData.h  (revision 189859)
+++ PHPCadesCPHashedData.h  (working copy)
@@ -5,21 +5,21 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct hash_dat_obj {
-    zend_object zo;
+typedef struct hashed_data_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPHashedDataObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} hashed_data_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
-extern zend_class_entry *hash_dat_class_entry;
-extern zend_object_handlers hash_dat_handlers;
+extern zend_class_entry *hashed_data_ce;
+extern zend_object_handlers hashed_data_obj_handlers;
 
-void hash_dat_free_storage(void *object TSRMLS_DC);
-zend_object_value hash_dat_create_handler(zend_class_entry *type TSRMLS_DC);
+// void hashed_data_free_storage(void *object TSRMLS_DC);
+// zend_object_value hashed_data_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
-void hash_dat_init(TSRMLS_D);
+void hashed_data_init(TSRMLS_D);
 
 #endif
Index: PHPCadesCPKeyUsage.cpp
===================================================================
--- PHPCadesCPKeyUsage.cpp	(revision 161471)
+++ PHPCadesCPKeyUsage.cpp	(working copy)
@@ -3,7 +3,8 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPKeyUsage, __construct) {
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPKeyUsageObject>(
         new CPPCadesCPKeyUsageObject());
 }
@@ -11,7 +12,8 @@
 PHP_METHOD(CPKeyUsage, get_IsPresent) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsPresent(&val));
     if (val) {
@@ -24,7 +26,8 @@
 PHP_METHOD(CPKeyUsage, get_IsCritical) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsCritical(&val));
     if (val) {
@@ -37,7 +40,8 @@
 PHP_METHOD(CPKeyUsage, get_IsDigitalSignatureEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_IsDigitalSignatureEnabled(&val));
@@ -51,7 +55,8 @@
 PHP_METHOD(CPKeyUsage, get_IsNonRepudiationEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_IsNonRepudiationEnabled(&val));
@@ -65,7 +70,8 @@
 PHP_METHOD(CPKeyUsage, get_IsKeyEnciphermentEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_IsKeyEnciphermentEnabled(&val));
@@ -79,7 +85,8 @@
 PHP_METHOD(CPKeyUsage, get_IsDataEnciphermentEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_IsDataEnciphermentEnabled(&val));
@@ -93,7 +100,8 @@
 PHP_METHOD(CPKeyUsage, get_IsKeyAgreementEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsKeyAgreementEnabled(&val));
     if (val) {
@@ -106,7 +114,8 @@
 PHP_METHOD(CPKeyUsage, get_IsKeyCertSignEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsKeyCertSignEnabled(&val));
     if (val) {
@@ -119,7 +128,8 @@
 PHP_METHOD(CPKeyUsage, get_IsCRLSignEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsCRLSignEnabled(&val));
     if (val) {
@@ -132,7 +142,8 @@
 PHP_METHOD(CPKeyUsage, get_IsEncipherOnlyEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsEncipherOnlyEnabled(&val));
     if (val) {
@@ -145,7 +156,8 @@
 PHP_METHOD(CPKeyUsage, get_IsDecipherOnlyEnabled) {
     BOOL val;
 
-    ku_obj *obj = (ku_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    ku_obj *obj = (ku_obj *)((char *)zobj - XtOffsetOf(ku_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IsDecipherOnlyEnabled(&val));
     if (val) {
@@ -158,39 +170,22 @@
 zend_object_handlers ku_obj_handlers;
 zend_class_entry *ku_ce;
 
-void ku_free_storage(void *object TSRMLS_DC) {
-    ku_obj *obj = (ku_obj *)object;
+static void ku_free (zend_object *object TSRMLS_DC) {
+    ku_obj *obj = (ku_obj *)((char *)object - XtOffsetOf(ku_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value ku_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* ku_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    ku_obj *obj = (ku_obj *)emalloc(sizeof(ku_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(ku_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &ku_obj_handlers;
 
-    ku_obj *obj = (ku_obj *)emalloc(sizeof(ku_obj));
-    memset(obj, 0, sizeof(ku_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, ku_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &ku_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -206,8 +201,8 @@
     PHP_ME(CPKeyUsage, get_IsKeyCertSignEnabled, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPKeyUsage, get_IsCRLSignEnabled, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPKeyUsage, get_IsEncipherOnlyEnabled, NULL, ZEND_ACC_PUBLIC)
-    PHP_ME(CPKeyUsage, get_IsDecipherOnlyEnabled, NULL,
-           ZEND_ACC_PUBLIC){NULL, NULL, NULL}};
+    PHP_ME(CPKeyUsage, get_IsDecipherOnlyEnabled, NULL, ZEND_ACC_PUBLIC)
+    {NULL, NULL, NULL}};
 
 void ku_init(TSRMLS_D) {
     zend_class_entry ce;
@@ -217,4 +212,6 @@
     memcpy(&ku_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     ku_obj_handlers.clone_obj = NULL;
+    ku_obj_handlers.free_obj = ku_free;
+    ku_obj_handlers.offset = XtOffsetOf(ku_obj, zobj);
 }
Index: PHPCadesCPKeyUsage.h
===================================================================
--- PHPCadesCPKeyUsage.h	(revision 161471)
+++ PHPCadesCPKeyUsage.h	(working copy)
@@ -5,10 +5,10 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct ku_obj {
-    zend_object zo;
+typedef struct _ku_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPKeyUsageObject> m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} ku_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers ku_obj_handlers;
@@ -15,11 +15,11 @@
 extern zend_class_entry *ku_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void ku_free_storage(void *object TSRMLS_DC);
+// void ku_free_storage(void *object TSRMLS_DC);
 
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value ku_create_handler(zend_class_entry *type TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value ku_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPOID.cpp
===================================================================
--- PHPCadesCPOID.cpp	(revision 161471)
+++ PHPCadesCPOID.cpp	(working copy)
@@ -3,7 +3,8 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPOID, __construct) {
-    oid_obj *obj = (oid_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    oid_obj *obj = (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
     obj->m_pCppCadesImpl =
         boost::shared_ptr<CPPCadesCPOIDObject>(new CPPCadesCPOIDObject());
 }
@@ -11,7 +12,8 @@
 PHP_METHOD(CPOID, get_Value) {
     boost::shared_ptr<CAtlStringA> atl;
 
-    oid_obj *obj = (oid_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    oid_obj *obj = (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Value(atl));
 
@@ -20,9 +22,10 @@
 
 PHP_METHOD(CPOID, set_Value) {
     char *str;
-    int len;
+    size_t len;
 
-    oid_obj *obj = (oid_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    oid_obj *obj = (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
@@ -34,7 +37,8 @@
 PHP_METHOD(CPOID, get_FriendlyName) {
     CAtlString atlstr;
 
-    oid_obj *obj = (oid_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    oid_obj *obj = (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_FriendlyName(atlstr));
 
@@ -44,39 +48,22 @@
 zend_object_handlers oid_obj_handlers;
 zend_class_entry *oid_ce;
 
-void oid_free_storage(void *object TSRMLS_DC) {
-    oid_obj *obj = (oid_obj *)object;
+static void oid_free(zend_object *object TSRMLS_DC) {
+    oid_obj *obj = (oid_obj *)((char *)object - XtOffsetOf(oid_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value oid_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* oid_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    oid_obj *obj = (oid_obj *)emalloc(sizeof(oid_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(oid_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &oid_obj_handlers;
 
-    oid_obj *obj = (oid_obj *)emalloc(sizeof(oid_obj));
-    memset(obj, 0, sizeof(oid_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, oid_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &oid_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -94,4 +81,6 @@
     memcpy(&oid_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     oid_obj_handlers.clone_obj = NULL;
+    oid_obj_handlers.free_obj = oid_free;
+    oid_obj_handlers.offset = XtOffsetOf(oid_obj, zobj);
 }
Index: PHPCadesCPOID.h
===================================================================
--- PHPCadesCPOID.h	(revision 161471)
+++ PHPCadesCPOID.h	(working copy)
@@ -5,10 +5,10 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct oid_obj {
-    zend_object zo;
+typedef struct _oid_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPOIDObject> m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} oid_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers oid_obj_handlers;
@@ -15,10 +15,10 @@
 extern zend_class_entry *oid_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void oid_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value oid_create_handler(zend_class_entry *type TSRMLS_DC);
+// void oid_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value oid_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPPrivateKey.cpp
===================================================================
--- PHPCadesCPPrivateKey.cpp	(revision 161471)
+++ PHPCadesCPPrivateKey.cpp	(working copy)
@@ -4,8 +4,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPPrivateKey, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     private_key_obj *obj =
-        (private_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (private_key_obj *)((char *)zobj - XtOffsetOf(private_key_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPPrivateKeyObject>(
         new CPPCadesCPPrivateKeyObject());
 }
@@ -13,8 +14,9 @@
 PHP_METHOD(CPPrivateKey, get_ContainerName) {
     CAtlString atlstr;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     private_key_obj *obj =
-        (private_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (private_key_obj *)((char *)zobj - XtOffsetOf(private_key_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ContainerName(atlstr));
 
@@ -24,8 +26,9 @@
 PHP_METHOD(CPPrivateKey, get_UniqueContainerName) {
     CAtlString atlstr;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     private_key_obj *obj =
-        (private_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (private_key_obj *)((char *)zobj - XtOffsetOf(private_key_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_UniqueContainerName(atlstr));
 
@@ -35,8 +38,9 @@
 PHP_METHOD(CPPrivateKey, get_ProviderName) {
     CAtlString atlstr;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     private_key_obj *obj =
-        (private_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (private_key_obj *)((char *)zobj - XtOffsetOf(private_key_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ProviderName(atlstr));
 
@@ -46,8 +50,9 @@
 PHP_METHOD(CPPrivateKey, get_ProviderType) {
     CAPICOM_PROV_TYPE type;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     private_key_obj *obj =
-        (private_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (private_key_obj *)((char *)zobj - XtOffsetOf(private_key_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ProviderType(&type));
 
@@ -57,8 +62,9 @@
 PHP_METHOD(CPPrivateKey, get_KeySpec) {
     CAPICOM_KEY_SPEC spec;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     private_key_obj *obj =
-        (private_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (private_key_obj *)((char *)zobj - XtOffsetOf(private_key_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_KeySpec(&spec));
 
@@ -68,39 +74,22 @@
 zend_object_handlers private_key_obj_handlers;
 zend_class_entry *private_key_ce;
 
-void private_key_free_storage(void *object TSRMLS_DC) {
-    private_key_obj *obj = (private_key_obj *)object;
+static void private_key_free(zend_object *object) {
+    private_key_obj *obj = (private_key_obj *)((char *)object - XtOffsetOf(private_key_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value private_key_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* private_key_create_handler(zend_class_entry *ce) {
+    private_key_obj *obj = (private_key_obj *)emalloc(sizeof(private_key_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(private_key_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &private_key_obj_handlers;
 
-    private_key_obj *obj = (private_key_obj *)emalloc(sizeof(private_key_obj));
-    memset(obj, 0, sizeof(private_key_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(obj, NULL, private_key_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &private_key_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -123,4 +112,6 @@
     memcpy(&private_key_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     private_key_obj_handlers.clone_obj = NULL;
+    private_key_obj_handlers.free_obj = private_key_free;
+    private_key_obj_handlers.offset = XtOffsetOf(private_key_obj, zobj);
 }
Index: PHPCadesCPPrivateKey.h
===================================================================
--- PHPCadesCPPrivateKey.h	(revision 161471)
+++ PHPCadesCPPrivateKey.h	(working copy)
@@ -5,21 +5,21 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct private_key_obj {
-    zend_object zo;
+typedef struct _private_key_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPPrivateKeyObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} private_key_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers private_key_obj_handlers;
 extern zend_class_entry *private_key_ce;
 
-//функция освобождения памяти. используется при уничтожении объектов
-void private_key_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value private_key_create_handler(zend_class_entry *type TSRMLS_DC);
+// //функция освобождения памяти. используется при уничтожении объектов
+// void private_key_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value private_key_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPPublicKey.cpp
===================================================================
--- PHPCadesCPPublicKey.cpp	(revision 161471)
+++ PHPCadesCPPublicKey.cpp	(working copy)
@@ -5,19 +5,22 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPPublicKey, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     public_key_obj *obj =
-        (public_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (public_key_obj *)((char *)zobj - XtOffsetOf(public_key_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesCPPublicKeyObject>(
         new CPPCadesCPPublicKeyObject());
 }
 
 PHP_METHOD(CPPublicKey, get_Algorithm) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     public_key_obj *obj =
-        (public_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (public_key_obj *)((char *)zobj - XtOffsetOf(public_key_obj, zobj));
 
     object_init_ex(return_value, oid_ce);
+    zobj = Z_OBJ_P(return_value);
     oid_obj *oobj =
-        (oid_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (oid_obj *)((char *)zobj - XtOffsetOf(oid_obj, zobj));
     oobj->m_pCppCadesImpl =
         boost::shared_ptr<CPPCadesCPOIDObject>(new CPPCadesCPOIDObject());
 
@@ -28,8 +31,9 @@
 PHP_METHOD(CPPublicKey, get_Length) {
     DWORD len;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     public_key_obj *obj =
-        (public_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (public_key_obj *)((char *)zobj - XtOffsetOf(public_key_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Length(&len));
 
     RETURN_LONG(len)
@@ -36,12 +40,13 @@
 }
 
 PHP_METHOD(CPPublicKey, get_EncodedKey) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     public_key_obj *obj =
-        (public_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (public_key_obj *)((char *)zobj - XtOffsetOf(public_key_obj, zobj));
 
     object_init_ex(return_value, encoded_data_ce);
-    encoded_data_obj *dobj = (encoded_data_obj *)zend_object_store_get_object(
-        return_value TSRMLS_CC);
+    zobj = Z_OBJ_P(return_value);
+    encoded_data_obj *dobj = (encoded_data_obj *)((char *)zobj - XtOffsetOf(encoded_data_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_EncodedKey(dobj->m_pCppCadesImpl));
@@ -48,13 +53,15 @@
 }
 
 PHP_METHOD(CPPublicKey, get_EncodedParameters) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     public_key_obj *obj =
-        (public_key_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (public_key_obj *)((char *)zobj - XtOffsetOf(public_key_obj, zobj));
 
     object_init_ex(return_value, encoded_data_ce);
-    encoded_data_obj *dobj = (encoded_data_obj *)zend_object_store_get_object(
-        return_value TSRMLS_CC);
+    zobj = Z_OBJ_P(return_value);
+    encoded_data_obj *dobj = (encoded_data_obj *)((char *)zobj - XtOffsetOf(encoded_data_obj, zobj));
 
+
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_EncodedParameters(dobj->m_pCppCadesImpl));
 }
@@ -62,39 +69,22 @@
 zend_object_handlers public_key_obj_handlers;
 zend_class_entry *public_key_ce;
 
-void public_key_free_storage(void *object TSRMLS_DC) {
-    public_key_obj *obj = (public_key_obj *)object;
+static void public_key_free(zend_object *object TSRMLS_DC) {
+    public_key_obj *obj = (public_key_obj *)((char *)object - XtOffsetOf(public_key_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value public_key_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* public_key_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    public_key_obj *obj = (public_key_obj *)emalloc(sizeof(public_key_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(public_key_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &public_key_obj_handlers;
 
-    public_key_obj *obj = (public_key_obj *)emalloc(sizeof(public_key_obj));
-    memset(obj, 0, sizeof(public_key_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(obj, NULL, public_key_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &public_key_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -103,8 +93,8 @@
     PHP_ME(CPPublicKey, get_Algorithm, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPPublicKey, get_Length, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPPublicKey, get_EncodedKey, NULL, ZEND_ACC_PUBLIC)
-    PHP_ME(CPPublicKey, get_EncodedParameters, NULL,
-           ZEND_ACC_PUBLIC){NULL, NULL, NULL}};
+    PHP_ME(CPPublicKey, get_EncodedParameters, NULL, ZEND_ACC_PUBLIC)
+    {NULL, NULL, NULL}};
 
 void public_key_init(TSRMLS_D) {
     zend_class_entry ce;
@@ -114,4 +104,6 @@
     memcpy(&public_key_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     public_key_obj_handlers.clone_obj = NULL;
+    public_key_obj_handlers.free_obj = public_key_free;
+    public_key_obj_handlers.offset = XtOffsetOf(public_key_obj, zobj);
 }
Index: PHPCadesCPPublicKey.h
===================================================================
--- PHPCadesCPPublicKey.h	(revision 161471)
+++ PHPCadesCPPublicKey.h	(working copy)
@@ -5,11 +5,11 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct public_key_obj {
-    zend_object zo;
+typedef struct _public_key_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPPublicKeyObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} public_key_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers public_key_obj_handlers;
@@ -16,10 +16,10 @@
 extern zend_class_entry *public_key_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void public_key_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value public_key_create_handler(zend_class_entry *type TSRMLS_DC);
+// void public_key_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value public_key_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPRawSignature.cpp
===================================================================
--- PHPCadesCPRawSignature.cpp	(revision 161471)
+++ PHPCadesCPRawSignature.cpp	(working copy)
@@ -5,8 +5,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPRawSignature, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     raw_sig_obj *obj =
-        (raw_sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (raw_sig_obj *)((char *)zobj - XtOffsetOf(raw_sig_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesRawSignatureObject>(
         new CPPCadesRawSignatureObject());
 }
@@ -14,23 +15,27 @@
 PHP_METHOD(CPRawSignature, VerifyHash) {
     zval *zHashedData;
     char *sVal;
-    int lVal;
+    size_t lVal;
     zval *zCert;
     CCertContext Context;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OsO", &zHashedData,
-                              hash_dat_class_entry, &sVal, &lVal, &zCert,
+                              hashed_data_ce, &sVal, &lVal, &zCert,
                               cert_ce) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    hash_dat_obj *pHashedData =
-        (hash_dat_obj *)zend_object_store_get_object(zHashedData TSRMLS_CC);
-    cert_obj *pCert = (cert_obj *)zend_object_store_get_object(zCert TSRMLS_CC);
     CAtlString Val(sVal, lVal);
-
+    zend_object *zobj = Z_OBJ_P(getThis());
     raw_sig_obj *obj =
-        (raw_sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (raw_sig_obj *)((char *)zobj - XtOffsetOf(raw_sig_obj, zobj));
 
+    zobj = Z_OBJ_P(zHashedData);
+    hashed_data_obj *pHashedData =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
+
+    zobj = Z_OBJ_P(zCert);    
+    certificate_obj *pCert = (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->VerifyHash(
         pHashedData->m_pCppCadesImpl, Val, pCert->m_pCppCadesImpl));
 }
@@ -41,15 +46,21 @@
     CAtlString Val;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &zHashedData,
-                              hash_dat_class_entry, &zCert, cert_ce) == FAILURE)
+                              hashed_data_ce, &zCert, cert_ce) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    hash_dat_obj *pHashedData =
-        (hash_dat_obj *)zend_object_store_get_object(zHashedData TSRMLS_CC);
-    cert_obj *pCert = (cert_obj *)zend_object_store_get_object(zCert TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    raw_sig_obj *obj =
+        (raw_sig_obj *)((char *)zobj - XtOffsetOf(raw_sig_obj, zobj));
 
-    raw_sig_obj *obj =
-        (raw_sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zobj = Z_OBJ_P(zHashedData);
+    hashed_data_obj *pHashedData =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
+
+    zobj = Z_OBJ_P(zCert);    
+    certificate_obj *pCert = (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
+
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->SignHash(
         pHashedData->m_pCppCadesImpl, pCert->m_pCppCadesImpl, Val));
     RETURN_ATL_STRINGL(Val)
@@ -60,50 +71,35 @@
     PHP_ME(CPRawSignature, VerifyHash, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPRawSignature, SignHash, NULL, ZEND_ACC_PUBLIC){NULL, NULL, NULL}};
 
-zend_class_entry *raw_sig_class_entry;
-zend_object_handlers raw_sig_handlers;
+zend_class_entry *raw_sig_ce;
+zend_object_handlers raw_sig_obj_handlers;
 
-void raw_sig_free_storage(void *object TSRMLS_DC) {
-    raw_sig_obj *obj = (raw_sig_obj *)object;
+static void raw_sig_free(zend_object *object TSRMLS_DC) {
+    raw_sig_obj *obj = (raw_sig_obj *)((char *)object - XtOffsetOf(raw_sig_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value raw_sig_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* raw_sig_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    raw_sig_obj *obj = (raw_sig_obj *)emalloc(sizeof(raw_sig_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(raw_sig_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &raw_sig_obj_handlers;
 
-    raw_sig_obj *obj = (raw_sig_obj *)emalloc(sizeof(raw_sig_obj));
-    memset(obj, 0, sizeof(raw_sig_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, raw_sig_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &raw_sig_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 void raw_sig_init(TSRMLS_D) {
     zend_class_entry ce;
     INIT_CLASS_ENTRY(ce, "CPRawSignature", raw_sig_methods);
-    raw_sig_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
-    raw_sig_class_entry->create_object = raw_sig_create_handler;
-    memcpy(&raw_sig_handlers, zend_get_std_object_handlers(),
+    raw_sig_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    raw_sig_ce->create_object = raw_sig_create_handler;
+    memcpy(&raw_sig_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    raw_sig_handlers.clone_obj = NULL;
+    raw_sig_obj_handlers.clone_obj = NULL;
+    raw_sig_obj_handlers.free_obj = raw_sig_free;
+    raw_sig_obj_handlers.offset = XtOffsetOf(raw_sig_obj, zobj);
 }
Index: PHPCadesCPRawSignature.h
===================================================================
--- PHPCadesCPRawSignature.h	(revision 161471)
+++ PHPCadesCPRawSignature.h	(working copy)
@@ -5,18 +5,18 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct raw_sig_obj {
-    zend_object zo;
+typedef struct _raw_sig_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesRawSignatureObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} raw_sig_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
-extern zend_class_entry *raw_sig_class_entry;
-extern zend_object_handlers raw_sig_handlers;
+extern zend_class_entry *raw_sig_ce;
+extern zend_object_handlers raw_sig_obj_handlers;
 
-void raw_sig_free_storage(void *object TSRMLS_DC);
-zend_object_value raw_sig_create_handler(zend_class_entry *type TSRMLS_DC);
+// void raw_sig_free_storage(void *object TSRMLS_DC);
+// zend_object_value raw_sig_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPRecipients.cpp
===================================================================
--- PHPCadesCPRecipients.cpp	(revision 161471)
+++ PHPCadesCPRecipients.cpp	(working copy)
@@ -4,16 +4,18 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPRecipients, Add) {
-    zval *php_var;
-    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &php_var,
+    zval *recipients_zval;
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &recipients_zval,
                               cert_ce) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     recipients_obj *obj =
-        (recipients_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (recipients_obj *)((char *)zobj - XtOffsetOf(recipients_obj, zobj));
 
-    cert_obj *Recipient =
-        (cert_obj *)zend_object_store_get_object(php_var TSRMLS_CC);
+    zobj = Z_OBJ_P(recipients_zval);
+    certificate_obj *Recipient =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Add(Recipient->m_pCppCadesImpl));
 }
 
@@ -21,8 +23,9 @@
 PHP_METHOD(CPRecipients, get_Count) {
     unsigned int value;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     recipients_obj *obj =
-        (recipients_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (recipients_obj *)((char *)zobj - XtOffsetOf(recipients_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Count(&value));
 
@@ -36,21 +39,24 @@
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     recipients_obj *obj =
-        (recipients_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (recipients_obj *)((char *)zobj - XtOffsetOf(recipients_obj, zobj));
 
     boost::shared_ptr<CPPCadesCPCertificateObject> pVal;
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Item(index, pVal));
 
     object_init_ex(return_value, cert_ce);
-    cert_obj *Recipient =
-        (cert_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+    zobj = Z_OBJ_P(return_value);
+    certificate_obj *Recipient =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
     Recipient->m_pCppCadesImpl = pVal;
 }
 
 PHP_METHOD(CPRecipients, Clear) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     recipients_obj *obj =
-        (recipients_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (recipients_obj *)((char *)zobj - XtOffsetOf(recipients_obj, zobj));
     obj->m_pCppCadesImpl->Clear();
 }
 
@@ -61,23 +67,21 @@
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     recipients_obj *obj =
-        (recipients_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (recipients_obj *)((char *)zobj - XtOffsetOf(recipients_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Remove(index));
 }
 
-zend_class_entry *recipients_class_entry;
-zend_object_handlers recipients_handlers;
+zend_class_entry *recipients_ce;
+zend_object_handlers recipients_obj_handlers;
 
-void recipients_free_storage(void *object TSRMLS_DC) {
-    recipients_obj *obj = (recipients_obj *)object;
+static void recipients_free(zend_object *object TSRMLS_DC) {
+    recipients_obj *obj = (recipients_obj *)((char *)object - XtOffsetOf(recipients_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
 zend_function_entry recipients_methods[] = {
@@ -86,37 +90,25 @@
     PHP_ME(CPRecipients, get_Item, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPRecipients, Clear, NULL, ZEND_ACC_PUBLIC){NULL, NULL, NULL}};
 
-zend_object_value recipients_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* recipients_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    recipients_obj *obj = (recipients_obj *)emalloc(sizeof(recipients_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(recipients_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &recipients_obj_handlers;
 
-    recipients_obj *obj = (recipients_obj *)emalloc(sizeof(recipients_obj));
-    memset(obj, 0, sizeof(recipients_obj));
-
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-    retval.handle = zend_objects_store_put(obj, NULL, recipients_free_storage,
-                                           NULL TSRMLS_CC);
-    retval.handlers = &recipients_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 void recipients_init(TSRMLS_D) {
     zend_class_entry ce;
     INIT_CLASS_ENTRY(ce, "CPRecipients", recipients_methods);
-    recipients_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
-    recipients_class_entry->create_object = recipients_create_handler;
-    memcpy(&recipients_handlers, zend_get_std_object_handlers(),
+    recipients_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    recipients_ce->create_object = recipients_create_handler;
+    memcpy(&recipients_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    recipients_handlers.clone_obj = NULL;
+    recipients_obj_handlers.clone_obj = NULL;
+    recipients_obj_handlers.free_obj = recipients_free;
+    recipients_obj_handlers.offset = XtOffsetOf(recipients_obj, zobj);
 }
Index: PHPCadesCPRecipients.h
===================================================================
--- PHPCadesCPRecipients.h	(revision 161471)
+++ PHPCadesCPRecipients.h	(working copy)
@@ -5,18 +5,18 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct recipients_obj {
-    zend_object zo;
+typedef struct _recipients_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPRecipientsObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} recipients_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
-extern zend_class_entry *recipients_class_entry;
-extern zend_object_handlers recipients_handlers;
+extern zend_class_entry *recipients_ce;
+extern zend_object_handlers recipients_obj_handlers;
 
-void recipients_free_storage(void *object TSRMLS_DC);
-zend_object_value recipients_create_handler(zend_class_entry *type TSRMLS_DC);
+// void recipients_free_storage(void *object TSRMLS_DC);
+// zend_object_value recipients_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPSignedData.cpp
===================================================================
--- PHPCadesCPSignedData.cpp	(revision 161471)
+++ PHPCadesCPSignedData.cpp	(working copy)
@@ -7,8 +7,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPSignedData, __construct) {
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     obj->m_pCppCadesImpl = new CPPCadesSignedDataObject();
 }
 
@@ -26,7 +27,7 @@
     int lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Olll", &zSigner,
-                              sig_ce, &lCadesType, &lDetached,
+                              signer_ce, &lCadesType, &lDetached,
                               &lEncodingType) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
@@ -34,11 +35,14 @@
     Detached = (BOOL)lDetached;
     EncodingType = (CAPICOM_ENCODING_TYPE)lEncodingType;
 
-    sig_obj *pSigner =
-        (sig_obj *)zend_object_store_get_object(zSigner TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zobj = Z_OBJ_P(zSigner);
+    signer_obj *pSigner =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->SignCades(
         pSigner->m_pCppCadesImpl, CadesType, Detached, EncodingType, &bVal));
 
@@ -46,7 +50,7 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, bVal.pbData(), lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, SignHash) {
@@ -62,20 +66,26 @@
     int lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OOll", &zHashedData,
-                              hash_dat_class_entry, &zSigner, sig_ce,
+                              hashed_data_ce, &zSigner, signer_ce,
                               &lCadesType, &lEncodingType) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
     CadesType = (CADESCOM_CADES_TYPE)lCadesType;
     EncodingType = (CAPICOM_ENCODING_TYPE)lEncodingType;
+    
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
 
-    sig_obj *pSigner =
-        (sig_obj *)zend_object_store_get_object(zSigner TSRMLS_CC);
-    hash_dat_obj *pHashedData =
-        (hash_dat_obj *)zend_object_store_get_object(zHashedData TSRMLS_CC);
+    zobj = Z_OBJ_P(zSigner);
+    signer_obj *pSigner =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zobj = Z_OBJ_P(zHashedData);
+    hashed_data_obj *pHashedData =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
+
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->SignHash(
         pSigner->m_pCppCadesImpl, pHashedData->m_pCppCadesImpl, CadesType,
         EncodingType, &bVal));
@@ -84,7 +94,7 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, bVal.pbData(), lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, CoSignHash) {
@@ -100,7 +110,7 @@
     int lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OOll", &zSigner,
-                              sig_ce, &zHashedData, hash_dat_class_entry,
+                              signer_ce, &zHashedData, hashed_data_ce,
                               &lCadesType, &lEncodingType) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
@@ -107,13 +117,18 @@
     CadesType = (CADESCOM_CADES_TYPE)lCadesType;
     EncodingType = (CAPICOM_ENCODING_TYPE)lEncodingType;
 
-    sig_obj *pSigner =
-        (sig_obj *)zend_object_store_get_object(zSigner TSRMLS_CC);
-    hash_dat_obj *pHashedData =
-        (hash_dat_obj *)zend_object_store_get_object(zHashedData TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zobj = Z_OBJ_P(zSigner);
+    signer_obj *pSigner =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
+
+    zobj = Z_OBJ_P(zHashedData);
+    hashed_data_obj *pHashedData =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->CoSignHash(
         pSigner->m_pCppCadesImpl, pHashedData->m_pCppCadesImpl, CadesType,
         EncodingType, &bVal));
@@ -122,7 +137,7 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, bVal.pbData(), lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, Sign) {
@@ -137,17 +152,20 @@
     int lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Oll", &zSigner,
-                              sig_ce, &lDetached, &lEncodingType) == FAILURE)
+                              signer_ce, &lDetached, &lEncodingType) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
     Detached = (BOOL)lDetached;
     EncodingType = (CAPICOM_ENCODING_TYPE)lEncodingType;
 
-    sig_obj *pSigner =
-        (sig_obj *)zend_object_store_get_object(zSigner TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zobj = Z_OBJ_P(zSigner);
+    signer_obj *pSigner =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Sign(
         pSigner->m_pCppCadesImpl, Detached, EncodingType, &bVal));
 
@@ -155,7 +173,7 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, bVal.pbData(), lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, CoSign) {
@@ -167,17 +185,20 @@
     char *sVal;
     int lVal;
 
-    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &zSigner, sig_ce,
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &zSigner, signer_ce,
                               &lEncodingType) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
     EncodingType = (CAPICOM_ENCODING_TYPE)lEncodingType;
 
-    sig_obj *pSigner =
-        (sig_obj *)zend_object_store_get_object(zSigner TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zobj = Z_OBJ_P(zSigner);
+    signer_obj *pSigner =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->CoSign(pSigner->m_pCppCadesImpl,
                                                       EncodingType, &bVal));
 
@@ -185,7 +206,7 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, bVal.pbData(), lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, CoSignCades) {
@@ -200,17 +221,20 @@
     int lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Oll", &zSigner,
-                              sig_ce, &lCadesType, &lEncodingType) == FAILURE)
+                              signer_ce, &lCadesType, &lEncodingType) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
     CadesType = (CADESCOM_CADES_TYPE)lCadesType;
     EncodingType = (CAPICOM_ENCODING_TYPE)lEncodingType;
 
-    sig_obj *pSigner =
-        (sig_obj *)zend_object_store_get_object(zSigner TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zobj = Z_OBJ_P(zSigner);
+    signer_obj *pSigner =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->CoSignCades(
         pSigner->m_pCppCadesImpl, CadesType, EncodingType, &bVal));
 
@@ -218,7 +242,7 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, bVal.pbData(), lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, EnhanceCades) {
@@ -225,7 +249,7 @@
     long lCadesType;
     CADESCOM_CADES_TYPE CadesType;
     char *TSAAddress;
-    int AddressLen;
+    size_t AddressLen;
     long lEncodingType;
     CAPICOM_ENCODING_TYPE EncodingType;
     CryptoPro::CBlob bVal;
@@ -241,8 +265,9 @@
     CadesType = (CADESCOM_CADES_TYPE)lCadesType;
     EncodingType = (CAPICOM_ENCODING_TYPE)lEncodingType;
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->EnhanceCades(
         CadesType, CAtlString(TSAAddress), EncodingType, &bVal));
 
@@ -250,13 +275,13 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, bVal.pbData(), lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, Verify) {
     CryptoPro::CBlob bSignedMessage;
     unsigned char *sSignedMessage;
-    int lSignedMessage;
+    size_t lSignedMessage;
     long lDetached;
     BOOL Detached;
     long lVerifyFlag;
@@ -272,8 +297,9 @@
 
     bSignedMessage.assign(sSignedMessage, lSignedMessage);
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->Verify(bSignedMessage, Detached, VerifyFlag));
 }
@@ -281,7 +307,7 @@
 PHP_METHOD(CPSignedData, VerifyCades) {
     CryptoPro::CBlob bSignedMessage;
     unsigned char *sSignedMessage;
-    int lSignedMessage;
+    size_t lSignedMessage;
     long lCadesType = CADESCOM_CADES_DEFAULT;
     CADESCOM_CADES_TYPE CadesType;
     long lDetached = 0;
@@ -297,8 +323,9 @@
 
     bSignedMessage.assign(sSignedMessage, lSignedMessage);
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->VerifyCades(bSignedMessage, CadesType, Detached));
 }
@@ -307,12 +334,12 @@
     CryptoPro::CBlob bSignedMessage;
     zval *zHashedData;
     unsigned char *sSignedMessage;
-    int lSignedMessage;
+    size_t lSignedMessage;
     long lCadesType = CADESCOM_CADES_DEFAULT;
     CADESCOM_CADES_TYPE CadesType;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &zHashedData,
-                              hash_dat_class_entry, &sSignedMessage,
+                              hashed_data_ce, &sSignedMessage,
                               &lSignedMessage, &lCadesType) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
@@ -320,11 +347,13 @@
 
     bSignedMessage.assign(sSignedMessage, lSignedMessage);
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
 
-    hash_dat_obj *pHashedData =
-        (hash_dat_obj *)zend_object_store_get_object(zHashedData TSRMLS_CC);
+    zobj = Z_OBJ_P(zHashedData);
+    hashed_data_obj *pHashedData =
+        (hashed_data_obj *)((char *)zobj - XtOffsetOf(hashed_data_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->VerifyHash(
         pHashedData->m_pCppCadesImpl, bSignedMessage, CadesType));
@@ -340,8 +369,9 @@
 
     Type = (CADESCOM_CONTENT_ENCODING_TYPE)lType;
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_ContentEncoding(Type));
 }
 
@@ -348,8 +378,9 @@
 PHP_METHOD(CPSignedData, get_ContentEncoding) {
     CADESCOM_CONTENT_ENCODING_TYPE type;
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_ContentEncoding(&type));
 
     RETURN_LONG(type)
@@ -357,14 +388,15 @@
 
 PHP_METHOD(CPSignedData, set_Content) {
     char *sVal;
-    int lVal;
+    size_t lVal;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &sVal, &lVal) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Content(sVal, lVal));
 }
 
@@ -373,8 +405,9 @@
     char *sVal;
     int lVal;
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Content(Val));
 
     lVal = Val.GetLength();
@@ -381,16 +414,18 @@
     sVal = (char *)ecalloc(lVal, sizeof(char));
     memcpy(sVal, Val, lVal);
 
-    RETURN_STRINGL(sVal, lVal, 0)
+    RETURN_STRINGL(sVal, lVal)
 }
 
 PHP_METHOD(CPSignedData, get_Signers) {
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
+
     object_init_ex(return_value, signers_ce);
+    zobj = Z_OBJ_P(return_value);
     signers_obj *pSigners =
-        (signers_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
-
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (signers_obj *)((char *)zobj - XtOffsetOf(signers_obj, zobj));
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_Signers(pSigners->m_pCppCadesImpl));
 
@@ -400,20 +435,22 @@
 PHP_METHOD(CPSignedData, get_Certificates) {
     boost::shared_ptr<CPPCadesCPCertificatesObject> pVal;
 
-    sig_dat_obj *obj =
-        (sig_dat_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_data_obj *obj =
+        (signed_data_obj *)((char *)zobj - XtOffsetOf(signed_data_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Certificates(pVal));
 
     object_init_ex(return_value, certs_ce);
+    zobj = Z_OBJ_P(return_value);
     certs_obj *pCertificates =
-        (certs_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
     pCertificates->m_pCppCadesImpl = pVal;
 }
 
-zend_class_entry *sig_dat_class_entry;
-zend_object_handlers sig_dat_handlers;
+zend_class_entry *signed_data_ce;
+zend_object_handlers signed_data_obj_handlers;
 
-zend_function_entry sig_dat_methods[] = {
+zend_function_entry signed_data_methods[] = {
     PHP_ME(CPSignedData, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
     PHP_ME(CPSignedData, SignCades, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPSignedData, SignHash, NULL, ZEND_ACC_PUBLIC)
@@ -433,47 +470,32 @@
     PHP_ME(CPSignedData, get_Certificates, NULL, ZEND_ACC_PUBLIC){NULL, NULL,
                                                                   NULL}};
 
-void sig_dat_free_storage(void *object TSRMLS_DC) {
-    sig_dat_obj *obj = (sig_dat_obj *)object;
-    delete obj->m_pCppCadesImpl;
+static void signed_data_free(zend_object *object TSRMLS_DC) {
+    signed_data_obj *obj = (signed_data_obj *)((char *)object - XtOffsetOf(signed_data_obj, zobj));
+    delete(obj->m_pCppCadesImpl);
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value sig_dat_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* signed_data_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    signed_data_obj *obj = (signed_data_obj *)emalloc(sizeof(signed_data_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(signed_data_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &signed_data_obj_handlers;
 
-    sig_dat_obj *obj = (sig_dat_obj *)emalloc(sizeof(sig_dat_obj));
-    memset(obj, 0, sizeof(sig_dat_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, sig_dat_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &sig_dat_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
-void sig_dat_init(TSRMLS_D) {
+void signed_data_init(TSRMLS_D) {
     zend_class_entry ce;
-    INIT_CLASS_ENTRY(ce, "CPSignedData", sig_dat_methods);
-    sig_dat_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
-    sig_dat_class_entry->create_object = sig_dat_create_handler;
-    memcpy(&sig_dat_handlers, zend_get_std_object_handlers(),
+    INIT_CLASS_ENTRY(ce, "CPSignedData", signed_data_methods);
+    signed_data_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    signed_data_ce->create_object = signed_data_create_handler;
+    memcpy(&signed_data_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    sig_dat_handlers.clone_obj = NULL;
+    signed_data_obj_handlers.clone_obj = NULL;
+    signed_data_obj_handlers.free_obj = signed_data_free;
+    signed_data_obj_handlers.offset = XtOffsetOf(signed_data_obj, zobj);
 }
Index: PHPCadesCPSignedData.h
===================================================================
--- PHPCadesCPSignedData.h	(revision 161471)
+++ PHPCadesCPSignedData.h	(working copy)
@@ -5,19 +5,19 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct sig_dat_obj {
-    zend_object zo;
+typedef struct _signed_data_obj {
     CryptoPro::PKI::CAdES::CPPCadesSignedDataObject *m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} signed_data_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
-extern zend_class_entry *sig_dat_class_entry;
-extern zend_object_handlers sig_dat_handlers;
+extern zend_class_entry *signed_data_ce;
+extern zend_object_handlers signed_data_obj_handlers;
 
-void sig_dat_free_storage(void *object TSRMLS_DC);
-zend_object_value sig_dat_create_handler(zend_class_entry *type TSRMLS_DC);
+// void signed_data_free_storage(void *object TSRMLS_DC);
+// zend_object_value signed_data_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
-void sig_dat_init(TSRMLS_D);
+void signed_data_init(TSRMLS_D);
 #endif
Index: PHPCadesCPSignedXML.cpp
===================================================================
--- PHPCadesCPSignedXML.cpp	(revision 161471)
+++ PHPCadesCPSignedXML.cpp	(working copy)
@@ -5,8 +5,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPSignedXML, __construct) {
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesSignedXMLObject>(
         new CPPCadesSignedXMLObject());
 }
@@ -13,14 +14,15 @@
 
 PHP_METHOD(CPSignedXML, set_Content) {
     char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
     CStringBlob content(str);
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Content(content));
@@ -29,8 +31,9 @@
 PHP_METHOD(CPSignedXML, get_Content) {
     CStringBlob content;
 
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Content(content));
 
     RETURN_ATL_STRING_A(content)
@@ -46,8 +49,9 @@
 
     type = (CADESCOM_XML_SIGNATURE_TYPE)ltype;
 
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_SignatureType(type));
 }
@@ -54,14 +58,15 @@
 
 PHP_METHOD(CPSignedXML, set_DigestMethod) {
     char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
     CStringBlob method(str);
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_DigestMethod(method));
@@ -69,14 +74,15 @@
 
 PHP_METHOD(CPSignedXML, set_SignatureMethod) {
     char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
     CStringBlob method(str);
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_SignatureMethod(method));
@@ -83,12 +89,14 @@
 }
 
 PHP_METHOD(CPSignedXML, get_Signers) {
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
 
     object_init_ex(return_value, signers_ce);
+    zobj = Z_OBJ_P(return_value);
     signers_obj *pSigners =
-        (signers_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (signers_obj *)((char *)zobj - XtOffsetOf(signers_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_Signers(pSigners->m_pCppCadesImpl));
@@ -95,23 +103,25 @@
 }
 
 PHP_METHOD(CPSignedXML, Sign) {
-    zval *zsigner;
+    zval *zsigned_xml;
     CStringBlob sign;
     char *data_str;
-    int data_len = 0;
+    size_t data_len = 0;
 
-    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &zsigner, sig_ce,
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &zsigned_xml, signer_ce,
                               &data_str, &data_len) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
-    sig_obj *signer =
-        (sig_obj *)zend_object_store_get_object(zsigner TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
+    zobj = Z_OBJ_P(zsigned_xml);
+    signer_obj *signed_xml =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     CStringBlob path(data_str);
 
     HR_ERRORCHECK_RETURN(
-        obj->m_pCppCadesImpl->Sign(signer->m_pCppCadesImpl, path, sign));
+        obj->m_pCppCadesImpl->Sign(signed_xml->m_pCppCadesImpl, path, sign));
 
     RETURN_ATL_STRING_A(sign)
 }
@@ -118,7 +128,7 @@
 
 PHP_METHOD(CPSignedXML, Verify) {
     char *str_mes, *str_path;
-    int len_mes, len_path;
+    size_t len_mes, len_path;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &str_mes,
                               &len_mes, &str_path, &len_path) == FAILURE)
@@ -126,51 +136,36 @@
 
     CStringBlob mes(str_mes, len_mes);
     CStringBlob path(str_path, len_path);
-    sig_xml_obj *obj =
-        (sig_xml_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signed_xml_obj *obj =
+        (signed_xml_obj *)((char *)zobj - XtOffsetOf(signed_xml_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Verify(mes, path));
 }
 
-zend_object_handlers sig_xml_obj_handlers;
-zend_class_entry *sig_xml_ce;
+zend_object_handlers signed_xml_obj_handlers;
+zend_class_entry *signed_xml_ce;
 
-void sig_xml_free_storage(void *object TSRMLS_DC) {
-    sig_xml_obj *obj = (sig_xml_obj *)object;
+static void signed_xml_free(zend_object *object TSRMLS_DC) {
+    signed_xml_obj *obj = (signed_xml_obj *)((char *)object - XtOffsetOf(signed_xml_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value sig_xml_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* signed_xml_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    signed_xml_obj *obj = (signed_xml_obj *)emalloc(sizeof(signed_xml_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(signed_xml_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &signed_xml_obj_handlers;
 
-    sig_xml_obj *obj = (sig_xml_obj *)emalloc(sizeof(sig_xml_obj));
-    memset(obj, 0, sizeof(sig_xml_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-    retval.handle =
-        zend_objects_store_put(obj, NULL, sig_xml_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &sig_xml_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
-zend_function_entry sig_xml_methods[] = {
+zend_function_entry signed_xml_methods[] = {
     PHP_ME(CPSignedXML, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
     PHP_ME(CPSignedXML, set_Content, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPSignedXML, get_Content, NULL, ZEND_ACC_PUBLIC)
@@ -181,12 +176,14 @@
     PHP_ME(CPSignedXML, Sign, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPSignedXML, Verify, NULL, ZEND_ACC_PUBLIC){NULL, NULL, NULL}};
 
-void sig_xml_init(TSRMLS_D) {
+void signed_xml_init(TSRMLS_D) {
     zend_class_entry ce;
-    INIT_CLASS_ENTRY(ce, "CPSignedXML", sig_xml_methods);
-    sig_xml_ce = zend_register_internal_class(&ce TSRMLS_CC);
-    sig_xml_ce->create_object = sig_xml_create_handler;
-    memcpy(&sig_xml_obj_handlers, zend_get_std_object_handlers(),
+    INIT_CLASS_ENTRY(ce, "CPSignedXML", signed_xml_methods);
+    signed_xml_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    signed_xml_ce->create_object = signed_xml_create_handler;
+    memcpy(&signed_xml_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    sig_xml_obj_handlers.clone_obj = NULL;
+    signed_xml_obj_handlers.clone_obj = NULL;
+    signed_xml_obj_handlers.free_obj = signed_xml_free;
+    signed_xml_obj_handlers.offset = XtOffsetOf(signed_xml_obj, zobj);
 }
Index: PHPCadesCPSignedXML.h
===================================================================
--- PHPCadesCPSignedXML.h	(revision 161471)
+++ PHPCadesCPSignedXML.h	(working copy)
@@ -5,20 +5,20 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct sig_xml_obj {
-    zend_object zo;
+typedef struct _signed_xml_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesSignedXMLObject> m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} signed_xml_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
-extern zend_object_handlers sig_xml_obj_handlers;
-extern zend_class_entry *sig_xml_ce;
+extern zend_object_handlers signed_xml_obj_handlers;
+extern zend_class_entry *signed_xml_ce;
 
-void sig_xml_free_storage(void *object TSRMLS_DC);
-zend_object_value sig_xml_create_handler(zend_class_entry *type TSRMLS_DC);
+// void signed_xml_free_storage(void *object TSRMLS_DC);
+// zend_object_value signed_xml_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
-void sig_xml_init(TSRMLS_D);
+void signed_xml_init(TSRMLS_D);
 
 #endif
Index: PHPCadesCPSigner.cpp
===================================================================
--- PHPCadesCPSigner.cpp	(revision 161471)
+++ PHPCadesCPSigner.cpp	(working copy)
@@ -7,7 +7,9 @@
 
 //Методы
 PHP_METHOD(CPSigner, __construct) {
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     boost::shared_ptr<CPPCadesCPSignerObject> ptr(new CPPCadesCPSignerObject());
     obj->m_pCppCadesImpl = ptr;
 }
@@ -14,13 +16,16 @@
 
 PHP_METHOD(CPSigner, get_Certificate) {
     boost::shared_ptr<CPPCadesCPCertificateObject> ctxt;
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Certificate(ctxt));
 
     object_init_ex(return_value, cert_ce);
-    cert_obj *cobj =
-        (cert_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+    zobj = Z_OBJ_P(return_value);
+    certificate_obj *cobj =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
     cobj->m_pCppCadesImpl = ctxt;
 }
 
@@ -32,8 +37,11 @@
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
-    cert_obj *cobj = (cert_obj *)zend_object_store_get_object(cert TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
+    zobj = Z_OBJ_P(cert);
+    certificate_obj *cobj = (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     HR_ERRORCHECK_RETURN(cobj->m_pCppCadesImpl->get_CertContext(ctxt));
     boost::shared_ptr<CPPCadesCPCertificateObject> pCert(
@@ -45,7 +53,9 @@
 PHP_METHOD(CPSigner, get_Options) {
     CAPICOM_CERTIFICATE_INCLUDE_OPTION opt;
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Options(&opt));
 
     RETURN_LONG(opt)
@@ -60,17 +70,22 @@
 
     Opt = (CAPICOM_CERTIFICATE_INCLUDE_OPTION)lOpt;
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_Options(Opt));
 }
 
 PHP_METHOD(CPSigner, get_AuthenticatedAttributes) {
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
-    object_init_ex(return_value, attr_col_ce);
-    attr_col *aobj =
-        (attr_col *)zend_object_store_get_object(return_value TSRMLS_CC);
-    aobj->type = attr_ce;
+    object_init_ex(return_value, attributes_col_ce);
+    zobj = Z_OBJ_P(return_value);
+    attributes_col_obj *aobj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
+    aobj->type = attribute_ce;
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_AuthenticatedAttributes(
         aobj->m_pCppCadesImpl));
@@ -77,12 +92,15 @@
 }
 
 PHP_METHOD(CPSigner, get_UnauthenticatedAttributes) {
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
-    object_init_ex(return_value, attr_col_ce);
-    attr_col *aobj =
-        (attr_col *)zend_object_store_get_object(return_value TSRMLS_CC);
-    aobj->type = attr_ce;
+    object_init_ex(return_value, attributes_col_ce);
+    zobj = Z_OBJ_P(return_value);
+    attributes_col_obj *aobj =
+        (attributes_col_obj *)((char *)zobj - XtOffsetOf(attributes_col_obj, zobj));
+    aobj->type = attribute_ce;
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_UnauthenticatedAttributes(
         aobj->m_pCppCadesImpl));
@@ -91,7 +109,9 @@
 PHP_METHOD(CPSigner, get_TSAAddress) {
     CAtlString adrs;
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_TSAAddress(adrs));
 
@@ -100,13 +120,15 @@
 
 PHP_METHOD(CPSigner, set_TSAAddress) {
     char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_TSAAddress(CAtlString(str)));
 }
@@ -118,7 +140,9 @@
     boost::shared_ptr<CryptoPro::CBlob> pBlob;
     boost::shared_ptr<CPPCadesCPBlobsObject> ptr;
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_CRLs(ptr));
 
     HR_ERRORCHECK_RETURN(ptr->get_Count(&count));
@@ -129,7 +153,7 @@
         len = pBlob->cbData();
         str = (char *)ecalloc(len, sizeof(char));
         memcpy(str, pBlob->pbData(), len);
-        add_next_index_stringl(return_value, str, len, 0);
+        add_next_index_stringl(return_value, str, len);
         str = NULL;
     }
 }
@@ -141,7 +165,9 @@
     boost::shared_ptr<CryptoPro::CBlob> pBlob;
     boost::shared_ptr<CPPCadesCPBlobsObject> ptr;
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_OCSPResponses(ptr));
 
     HR_ERRORCHECK_RETURN(ptr->get_Count(&count));
@@ -152,7 +178,7 @@
         len = pBlob->cbData();
         str = (char *)ecalloc(len, sizeof(char));
         memcpy(str, pBlob->pbData(), len);
-        add_next_index_stringl(return_value, str, len, 0);
+        add_next_index_stringl(return_value, str, len);
         str = NULL;
     }
 }
@@ -161,7 +187,9 @@
     CryptoPro::CDateTime time;
     CryptoPro::CStringProxy strpr;
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_SigningTime(time));
 
@@ -173,7 +201,9 @@
     CryptoPro::CDateTime time;
     CryptoPro::CStringProxy strpr;
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_SignatureTimeStampTime(time));
@@ -184,57 +214,42 @@
 
 PHP_METHOD(CPSigner, set_KeyPin) {
     char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
-    sig_obj *obj = (sig_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+    zend_object *zobj = Z_OBJ_P(getThis());
+    signer_obj *obj =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     CAtlStringA pin(CA2CA(CAtlStringA(str), CP_UTF8));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_KeyPin(pin));
 }
 
 //Вспомогательные функции обертки
-zend_object_handlers sig_obj_handlers;
-zend_class_entry *sig_ce;
+zend_object_handlers signer_obj_handlers;
+zend_class_entry *signer_ce;
 
-void sig_free_storage(void *object TSRMLS_DC) {
-    sig_obj *obj = (sig_obj *)object;
+static void signer_free(zend_object *object) {
+    signer_obj *obj = (signer_obj *)((char *)object - XtOffsetOf(signer_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value sig_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* signer_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    signer_obj *obj = (signer_obj *)emalloc(sizeof(signer_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(signer_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &signer_obj_handlers;
 
-    sig_obj *obj = (sig_obj *)emalloc(sizeof(sig_obj));
-    memset(obj, 0, sizeof(sig_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, sig_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &sig_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
-zend_function_entry sig_methods[] = {
+zend_function_entry CPSigner_methods[] = {
     PHP_ME(CPSigner, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
     PHP_ME(CPSigner, get_Certificate, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPSigner, set_Certificate, NULL, ZEND_ACC_PUBLIC)
@@ -252,10 +267,12 @@
 
 void sig_init(TSRMLS_D) {
     zend_class_entry ce;
-    INIT_CLASS_ENTRY(ce, "CPSigner", sig_methods);
-    sig_ce = zend_register_internal_class(&ce TSRMLS_CC);
-    sig_ce->create_object = sig_create_handler;
-    memcpy(&sig_obj_handlers, zend_get_std_object_handlers(),
+    INIT_CLASS_ENTRY(ce, "CPSigner", CPSigner_methods);
+    signer_ce = zend_register_internal_class(&ce TSRMLS_CC);
+    signer_ce->create_object = signer_create_handler;
+    memcpy(&signer_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
-    sig_obj_handlers.clone_obj = NULL;
+    signer_obj_handlers.clone_obj = NULL;
+    signer_obj_handlers.free_obj = signer_free;
+    signer_obj_handlers.offset = XtOffsetOf(signer_obj, zobj);
 }
Index: PHPCadesCPSigner.h
===================================================================
--- PHPCadesCPSigner.h	(revision 161471)
+++ PHPCadesCPSigner.h	(working copy)
@@ -3,16 +3,16 @@
 
 #include "CPPCadesCPSigner.h"
 
-struct sig_obj {
-    zend_object zo;
+typedef struct _signer_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPSignerObject> m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} signer_obj;
 
-extern zend_object_handlers sig_obj_handlers;
-extern zend_class_entry *sig_ce;
+extern zend_object_handlers signer_obj_handlers;
+extern zend_class_entry *signer_ce;
 
-void sig_free_storage(void *object TSRMLS_DC);
-zend_object_value sig_create_handler(zend_class_entry *type TSRMLS_DC);
+// void sig_free_storage(void *object TSRMLS_DC);
+// zend_object* sig_create_handler(zend_class_entry *type TSRMLS_DC);
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
 void sig_init(TSRMLS_D);
Index: PHPCadesCPSigners.cpp
===================================================================
--- PHPCadesCPSigners.cpp	(revision 161471)
+++ PHPCadesCPSigners.cpp	(working copy)
@@ -6,8 +6,9 @@
 PHP_METHOD(CPSigners, get_Count) {
     unsigned int value;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     signers_obj *obj =
-        (signers_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (signers_obj *)((char *)zobj - XtOffsetOf(signers_obj, zobj));
 
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Count(&value));
 
@@ -22,24 +23,23 @@
 
     boost::shared_ptr<CPPCadesCPSignerObject> pVal;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     signers_obj *obj =
-        (signers_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (signers_obj *)((char *)zobj - XtOffsetOf(signers_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Item(index, pVal));
 
-    object_init_ex(return_value, sig_ce);
-    sig_obj *Signer =
-        (sig_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+    object_init_ex(return_value, signer_ce);
+    zobj = Z_OBJ_P(return_value);
+    signer_obj *Signer =
+        (signer_obj *)((char *)zobj - XtOffsetOf(signer_obj, zobj));
     Signer->m_pCppCadesImpl = pVal;
 }
 
-void signers_free_storage(void *object TSRMLS_DC) {
-    signers_obj *obj = (signers_obj *)object;
+static void signers_free(zend_object* object) {
+    signers_obj *obj = (signers_obj *)((char *)object - XtOffsetOf(signers_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
 zend_class_entry *signers_ce;
@@ -49,29 +49,15 @@
     PHP_ME(CPSigners, get_Count, NULL, ZEND_ACC_PUBLIC)
     PHP_ME(CPSigners, get_Item, NULL, ZEND_ACC_PUBLIC){NULL, NULL, NULL}};
 
-zend_object_value signers_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* signers_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    signers_obj *obj = (signers_obj *)emalloc(sizeof(signers_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(signers_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &signers_obj_handlers;
 
-    signers_obj *obj = (signers_obj *)emalloc(sizeof(signers_obj));
-    memset(obj, 0, sizeof(signers_obj));
-
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-    retval.handle =
-        zend_objects_store_put(obj, NULL, signers_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &signers_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 void signers_init(TSRMLS_D) {
@@ -82,4 +68,6 @@
     memcpy(&signers_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     signers_obj_handlers.clone_obj = NULL;
+    signers_obj_handlers.free_obj = signers_free;
+    signers_obj_handlers.offset = XtOffsetOf(signers_obj, zobj);
 }
Index: PHPCadesCPSigners.h
===================================================================
--- PHPCadesCPSigners.h	(revision 161471)
+++ PHPCadesCPSigners.h	(working copy)
@@ -5,17 +5,17 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct signers_obj {
-    zend_object zo;
+typedef struct _signers_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPSignersObject> m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} signers_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_class_entry *signers_ce;
 extern zend_object_handlers signers_obj_handlers;
 
-void signers_free_storage(void *object TSRMLS_DC);
-zend_object_value signers_create_handler(zend_class_entry *type TSRMLS_DC);
+// void signers_free_storage(void *object TSRMLS_DC);
+// zend_object* signers_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesCPStore.cpp
===================================================================
--- PHPCadesCPStore.cpp	(revision 161471)
+++ PHPCadesCPStore.cpp	(working copy)
@@ -7,8 +7,9 @@
 using namespace CryptoPro::PKI::CAdES;
 
 PHP_METHOD(CPStore, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     store_obj *obj =
-        (store_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (store_obj *)((char *)zobj - XtOffsetOf(store_obj, zobj));
     obj->m_pCppCadesImpl =
         boost::shared_ptr<CPPCadesCPStoreObject>(new CPPCadesCPStoreObject());
 }
@@ -20,7 +21,7 @@
     long lLocation;
     long lMode;
     CADESCOM_STORE_LOCATION Location;
-    int len;
+    size_t len;
     CAPICOM_STORE_OPEN_MODE Mode;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsl", &lLocation,
@@ -34,24 +35,28 @@
     wname = (wchar_t *)ecalloc(len + 1, sizeof(wchar_t));
     mbstowcs(wname, name, len);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     store_obj *obj =
-        (store_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (store_obj *)((char *)zobj - XtOffsetOf(store_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Open(Location, wname, Mode));
 }
 
 PHP_METHOD(CPStore, Close) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     store_obj *obj =
-        (store_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (store_obj *)((char *)zobj - XtOffsetOf(store_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->Close());
 }
 
 PHP_METHOD(CPStore, get_Certificates) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     store_obj *obj =
-        (store_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (store_obj *)((char *)zobj - XtOffsetOf(store_obj, zobj));
 
     object_init_ex(return_value, certs_ce);
+    zobj = Z_OBJ_P(return_value);
     certs_obj *cobj =
-        (certs_obj *)zend_object_store_get_object(return_value TSRMLS_CC);
+        (certs_obj *)((char *)zobj - XtOffsetOf(certs_obj, zobj));
 
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->get_Certificates(cobj->m_pCppCadesImpl));
@@ -58,8 +63,9 @@
 }
 
 PHP_METHOD(CPStore, get_Location) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     store_obj *obj =
-        (store_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (store_obj *)((char *)zobj - XtOffsetOf(store_obj, zobj));
 
     CADESCOM_STORE_LOCATION this_loc;
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Location(&this_loc));
@@ -68,8 +74,9 @@
 }
 
 PHP_METHOD(CPStore, get_Name) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     store_obj *obj =
-        (store_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (store_obj *)((char *)zobj - XtOffsetOf(store_obj, zobj));
 
     CAtlString wname;
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_Name(wname));
@@ -80,39 +87,22 @@
 zend_object_handlers store_obj_handlers;
 zend_class_entry *store_ce;
 
-void store_free_storage(void *object TSRMLS_DC) {
-    store_obj *obj = (store_obj *)object;
+static void store_free(zend_object *object TSRMLS_DC) {
+    store_obj *obj = (store_obj *)((char *)object - XtOffsetOf(store_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value store_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* store_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    store_obj *obj = (store_obj *)emalloc(sizeof(store_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(store_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &store_obj_handlers;
 
-    store_obj *obj = (store_obj *)emalloc(sizeof(store_obj));
-    memset(obj, 0, sizeof(store_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, store_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &store_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -132,4 +122,6 @@
     memcpy(&store_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     store_obj_handlers.clone_obj = NULL;
+    store_obj_handlers.free_obj = store_free;
+    store_obj_handlers.offset = XtOffsetOf(store_obj, zobj);
 }
Index: PHPCadesCPStore.h
===================================================================
--- PHPCadesCPStore.h	(revision 161471)
+++ PHPCadesCPStore.h	(working copy)
@@ -4,22 +4,22 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct store_obj {
-    zend_object zo;
+typedef struct _store_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesCPStoreObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} store_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers store_obj_handlers;
 extern zend_class_entry *store_ce;
 
-//функция освобождения памяти. используется при уничтожении объектов
-void store_free_storage(void *object TSRMLS_DC);
+// //функция освобождения памяти. используется при уничтожении объектов
+// void store_free_storage(void *object TSRMLS_DC);
 
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value store_create_handler(zend_class_entry *type TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value store_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesSymmetricAlgorithm.cpp
===================================================================
--- PHPCadesSymmetricAlgorithm.cpp	(revision 161471)
+++ PHPCadesSymmetricAlgorithm.cpp	(working copy)
@@ -6,9 +6,10 @@
 using namespace CryptoPro;
 
 PHP_METHOD(SymmetricAlgorithm, __construct) {
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
+
     obj->m_pCppCadesImpl = boost::shared_ptr<CPPCadesSymmetricAlgorithmObject>(
         new CPPCadesSymmetricAlgorithmObject());
 }
@@ -16,29 +17,31 @@
 PHP_METHOD(SymmetricAlgorithm, get_DiversData) {
     CBlob value;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
 
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_DiversData(value));
 
     char *ret_str = (char *)ecalloc(value.cbData(), sizeof(char));
     strncpy(ret_str, (const char *)value.pbData(), value.cbData());
-    RETURN_STRINGL(ret_str, value.cbData(), 0)
+    RETURN_STRINGL(ret_str, value.cbData())
 }
 
 PHP_METHOD(SymmetricAlgorithm, set_DiversData) {
     char *str;
-    unsigned int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
 
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_DiversData(str, len));
 }
 
@@ -45,28 +48,30 @@
 PHP_METHOD(SymmetricAlgorithm, get_IV) {
     CBlob value;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_IV(value));
 
     char *ret_str = (char *)ecalloc(value.cbData(), sizeof(char));
     strncpy(ret_str, (const char *)value.pbData(), value.cbData());
-    RETURN_STRINGL(ret_str, value.cbData(), 0)
+    RETURN_STRINGL(ret_str, value.cbData())
 }
 
 PHP_METHOD(SymmetricAlgorithm, set_IV) {
     char *str;
-    unsigned int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) ==
         FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
 
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->put_IV(str, len));
 }
 
@@ -73,15 +78,16 @@
 PHP_METHOD(SymmetricAlgorithm, Encrypt) {
     long isFinal = 1;
     char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &str, &len,
                               &isFinal) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
+
     CStringProxy retval;
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->Encrypt(str, len, isFinal, retval));
@@ -92,15 +98,16 @@
 PHP_METHOD(SymmetricAlgorithm, Decrypt) {
     long isFinal = 1;
     char *str;
-    int len;
+    size_t len;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &str, &len,
                               &isFinal) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
+
     CBlob value;
     HR_ERRORCHECK_RETURN(
         obj->m_pCppCadesImpl->Decrypt(str, len, isFinal, value));
@@ -107,21 +114,22 @@
 
     char *ret_str = (char *)ecalloc(value.cbData(), sizeof(char));
     strncpy(ret_str, (const char *)value.pbData(), value.cbData());
-    RETURN_STRINGL(ret_str, value.cbData(), 0)
+    RETURN_STRINGL(ret_str, value.cbData())
 }
 
 PHP_METHOD(SymmetricAlgorithm, DiversifyKey) {
     boost::shared_ptr<CPPCadesSymmetricAlgorithmObject> pVal;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->DiversifyKey(pVal));
 
     object_init_ex(return_value, symmetric_algorithm_ce);
+    zobj = Z_OBJ_P(return_value);
     symmetric_algorithm_obj *psym_algo_obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(
-            return_value TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
     psym_algo_obj->m_pCppCadesImpl = pVal;
 }
 
@@ -137,9 +145,10 @@
     if (lAlgo != -1)
         algorithm = (CADESCOM_ENCRYPTION_ALGORITHM)lAlgo;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->GenerateKey(algorithm));
 }
 
@@ -150,11 +159,13 @@
                               cert_ce) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
-    cert_obj *pCert =
-        (cert_obj *)zend_object_store_get_object(z_recipient TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
+    
+    zobj = Z_OBJ_P(z_recipient);   
+    certificate_obj *pCert =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
 
     CBlob value;
     HR_ERRORCHECK_RETURN(
@@ -162,15 +173,15 @@
 
     char *ret_str = (char *)ecalloc(value.cbData(), sizeof(char));
     strncpy(ret_str, (const char *)value.pbData(), value.cbData());
-    RETURN_STRINGL(ret_str, value.cbData(), 0)
+    RETURN_STRINGL(ret_str, value.cbData())
 }
 
 PHP_METHOD(SymmetricAlgorithm, ImportKey) {
     zval *z_recipient;
     char *data_str;
-    long ldata_str = 0;
+    size_t ldata_str = 0;
     char *pin_str;
-    long lpin_str = 0;
+    size_t lpin_str = 0;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sO|s", &data_str,
                               &ldata_str, &z_recipient, cert_ce, &pin_str,
@@ -177,12 +188,14 @@
                               &lpin_str) == FAILURE)
         RETURN_WITH_EXCEPTION(E_INVALIDARG);
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)zend_object_store_get_object(getThis()
-                                                                TSRMLS_CC);
-    cert_obj *pCert =
-        (cert_obj *)zend_object_store_get_object(z_recipient TSRMLS_CC);
+        (symmetric_algorithm_obj *)((char *)zobj - XtOffsetOf(symmetric_algorithm_obj, zobj));
 
+    zobj = Z_OBJ_P(z_recipient);   
+    certificate_obj *pCert =
+        (certificate_obj *)((char *)zobj - XtOffsetOf(certificate_obj, zobj));
+
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->ImportKey(
         data_str, ldata_str, pCert->m_pCppCadesImpl, pin_str, lpin_str));
 }
@@ -190,41 +203,23 @@
 zend_object_handlers symmetric_algorithm_obj_handlers;
 zend_class_entry *symmetric_algorithm_ce;
 
-void symmetric_algorithm_free_storage(void *object TSRMLS_DC) {
-    symmetric_algorithm_obj *obj = (symmetric_algorithm_obj *)object;
+static void symmetric_algorithm_free(zend_object *object TSRMLS_DC) {
+    symmetric_algorithm_obj *obj = (symmetric_algorithm_obj *)((char *)object - XtOffsetOf(symmetric_algorithm_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object);
 }
 
-zend_object_value symmetric_algorithm_create_handler(zend_class_entry *type
+static zend_object* symmetric_algorithm_create_handler(zend_class_entry *ce
                                                          TSRMLS_DC) {
-    zend_object_value retval;
+    symmetric_algorithm_obj *obj = (symmetric_algorithm_obj *)emalloc(sizeof(symmetric_algorithm_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(symmetric_algorithm_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce);
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &symmetric_algorithm_obj_handlers;
 
-    symmetric_algorithm_obj *obj =
-        (symmetric_algorithm_obj *)emalloc(sizeof(symmetric_algorithm_obj));
-    memset(obj, 0, sizeof(symmetric_algorithm_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle = zend_objects_store_put(
-        obj, NULL, symmetric_algorithm_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &symmetric_algorithm_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //связывание методов класса в function entry
@@ -251,4 +246,6 @@
     memcpy(&symmetric_algorithm_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     symmetric_algorithm_obj_handlers.clone_obj = NULL;
+    symmetric_algorithm_obj_handlers.free_obj = symmetric_algorithm_free;
+    symmetric_algorithm_obj_handlers.offset = XtOffsetOf(symmetric_algorithm_obj, zobj);
 }
Index: PHPCadesSymmetricAlgorithm.h
===================================================================
--- PHPCadesSymmetricAlgorithm.h	(revision 161471)
+++ PHPCadesSymmetricAlgorithm.h	(working copy)
@@ -5,11 +5,11 @@
 
 //объявление структуры, которая свяжет объект оборачиваемого класса
 //с объектом php
-struct symmetric_algorithm_obj {
-    zend_object zo;
+typedef struct _symmetric_algorithm_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPCadesSymmetricAlgorithmObject>
         m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} symmetric_algorithm_obj;
 
 //хэндлеры для обработки объектов оборачиваемого класса
 extern zend_object_handlers symmetric_algorithm_obj_handlers;
@@ -16,11 +16,11 @@
 extern zend_class_entry *symmetric_algorithm_ce;
 
 //функция освобождения памяти. используется при уничтожении объектов
-void symmetric_algorithm_free_storage(void *object TSRMLS_DC);
-//функция создания хэндлера для нового объекта класса. используется при
-//создании новых объектов
-zend_object_value symmetric_algorithm_create_handler(zend_class_entry *type
-                                                         TSRMLS_DC);
+// void symmetric_algorithm_free_storage(void *object TSRMLS_DC);
+// //функция создания хэндлера для нового объекта класса. используется при
+// //создании новых объектов
+// zend_object_value symmetric_algorithm_create_handler(zend_class_entry *type
+//                                                          TSRMLS_DC);
 
 //функция инициализации класса. должна включаться в
 //функцию, инициализации модуля
Index: PHPCadesVersion.cpp
===================================================================
--- PHPCadesVersion.cpp	(revision 161471)
+++ PHPCadesVersion.cpp	(working copy)
@@ -6,8 +6,10 @@
 
 //РњРµС‚РѕРґС‹
 PHP_METHOD(Version, __construct) {
+
+    zend_object *zobj = Z_OBJ_P(getThis());
     version_obj *obj =
-        (version_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (version_obj *)((char *)zobj - XtOffsetOf(version_obj, zobj));
     obj->m_pCppCadesImpl =
         boost::shared_ptr<CPPVersionObject>(new CPPVersionObject());
 }
@@ -14,8 +16,10 @@
 
 PHP_METHOD(Version, get_MajorVersion) {
     unsigned int version;
+
+    zend_object *zobj = Z_OBJ_P(getThis());
     version_obj *obj =
-        (version_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (version_obj *)((char *)zobj - XtOffsetOf(version_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_MajorVersion(&version));
 
     RETURN_LONG(version);
@@ -24,8 +28,9 @@
 PHP_METHOD(Version, get_MinorVersion) {
     unsigned int version;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     version_obj *obj =
-        (version_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (version_obj *)((char *)zobj - XtOffsetOf(version_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_MinorVersion(&version));
 
     RETURN_LONG(version);
@@ -34,8 +39,9 @@
 PHP_METHOD(Version, get_BuildVersion) {
     unsigned int version;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     version_obj *obj =
-        (version_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (version_obj *)((char *)zobj - XtOffsetOf(version_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->get_BuildVersion(&version));
 
     RETURN_LONG(version);
@@ -44,8 +50,9 @@
 PHP_METHOD(Version, toString) {
     CAtlString AtlVersion;
 
+    zend_object *zobj = Z_OBJ_P(getThis());
     version_obj *obj =
-        (version_obj *)zend_object_store_get_object(getThis() TSRMLS_CC);
+        (version_obj *)((char *)zobj - XtOffsetOf(version_obj, zobj));
     HR_ERRORCHECK_RETURN(obj->m_pCppCadesImpl->toString(AtlVersion));
 
     RETURN_ATL_STRING(AtlVersion);
@@ -55,39 +62,22 @@
 zend_object_handlers version_obj_handlers;
 zend_class_entry *version_ce;
 
-void version_free_storage(void *object TSRMLS_DC) {
-    version_obj *obj = (version_obj *)object;
+static void version_free(zend_object* object) {
+    version_obj *obj = (version_obj *)((char *)object - XtOffsetOf(version_obj, zobj));
     obj->m_pCppCadesImpl.reset();
 
-    zend_hash_destroy(obj->zo.properties);
-    FREE_HASHTABLE(obj->zo.properties);
-
-    efree(obj);
+    zend_object_std_dtor(object); /* call Zend's free handler, which will free object properties */
 }
 
-zend_object_value version_create_handler(zend_class_entry *type TSRMLS_DC) {
-    zend_object_value retval;
+static zend_object* version_create_handler(zend_class_entry *ce TSRMLS_DC) {
+    version_obj *obj = (version_obj *)emalloc(sizeof(version_obj) + zend_object_properties_size(ce));
+    memset(obj, 0, sizeof(version_obj) + zend_object_properties_size(ce));
+    
+    zend_object_std_init(&obj->zobj, ce); /* take care of the zend_object also ! */
+    object_properties_init(&obj->zobj, ce);
+    obj->zobj.handlers = &version_obj_handlers;
 
-    version_obj *obj = (version_obj *)emalloc(sizeof(version_obj));
-    memset(obj, 0, sizeof(version_obj));
-    obj->zo.ce = type;
-
-    ALLOC_HASHTABLE(obj->zo.properties);
-    zend_hash_init(obj->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-#if PHP_VERSION_ID < 50399
-    zval *tmp;
-    zend_hash_copy(obj->zo.properties, &(type->default_properties),
-                   (copy_ctor_func_t)zval_add_ref, (void *)&tmp,
-                   sizeof(zval *));
-#else
-    object_properties_init(&obj->zo, type);
-#endif
-
-    retval.handle =
-        zend_objects_store_put(obj, NULL, version_free_storage, NULL TSRMLS_CC);
-    retval.handlers = &version_obj_handlers;
-
-    return retval;
+    return &obj->zobj;
 }
 
 //СЃРІСЏР·С‹РІР°РЅРёРµ РјРµС‚РѕРґРѕРІ РєР»Р°СЃСЃР° РІ function entry
@@ -106,4 +96,6 @@
     memcpy(&version_obj_handlers, zend_get_std_object_handlers(),
            sizeof(zend_object_handlers));
     version_obj_handlers.clone_obj = NULL;
+    version_obj_handlers.free_obj = version_free;
+    version_obj_handlers.offset = XtOffsetOf(version_obj, zobj); /* Here, we declare the offset to the engine */
 }
Index: PHPCadesVersion.h
===================================================================
--- PHPCadesVersion.h	(revision 161471)
+++ PHPCadesVersion.h	(working copy)
@@ -6,10 +6,10 @@
 
 //РѕР±СЉСЏРІР»РµРЅРёРµ СЃС‚СЂСѓРєС‚СѓСЂС‹, РєРѕС‚РѕСЂР°СЏ СЃРІСЏР¶РµС‚ РѕР±СЉРµРєС‚ РѕР±РѕСЂР°С‡РёРІР°РµРјРѕРіРѕ РєР»Р°СЃСЃР°
 //СЃ РѕР±СЉРµРєС‚РѕРј php
-struct version_obj {
-    zend_object zo;
+typedef struct _version_obj {
     boost::shared_ptr<CryptoPro::PKI::CAdES::CPPVersionObject> m_pCppCadesImpl;
-};
+    zend_object zobj; /* MUST be the last element */
+} version_obj;
 
 //С…СЌРЅРґР»РµСЂС‹ РґР»СЏ РѕР±СЂР°Р±РѕС‚РєРё РѕР±СЉРµРєС‚РѕРІ РѕР±РѕСЂР°С‡РёРІР°РµРјРѕРіРѕ РєР»Р°СЃСЃР°
 extern zend_object_handlers version_obj_handlers;
@@ -16,12 +16,12 @@
 
 extern zend_class_entry *version_ce;
 
-//С„СѓРЅРєС†РёСЏ РѕСЃРІРѕР±РѕР¶РґРµРЅРёСЏ РїР°РјСЏС‚Рё. РёСЃРїРѕР»СЊР·СѓРµС‚СЃСЏ РїСЂРё СѓРЅРёС‡С‚РѕР¶РµРЅРёРё РѕР±СЉРµРєС‚РѕРІ
-void version_free_storage(void *object TSRMLS_DC);
+// С„СѓРЅРєС†РёСЏ РѕСЃРІРѕР±РѕР¶РґРµРЅРёСЏ РїР°РјСЏС‚Рё. РёСЃРїРѕР»СЊР·СѓРµС‚СЃСЏ РїСЂРё СѓРЅРёС‡С‚РѕР¶РµРЅРёРё РѕР±СЉРµРєС‚РѕРІ
+// void version_free_storage(void *object TSRMLS_DC);
 
 //С„СѓРЅРєС†РёСЏ СЃРѕР·РґР°РЅРёСЏ С…СЌРЅРґР»РµСЂР° РґР»СЏ РЅРѕРІРѕРіРѕ РѕР±СЉРµРєС‚Р° РєР»Р°СЃСЃР°. РёСЃРїРѕР»СЊР·СѓРµС‚СЃСЏ РїСЂРё
 //СЃРѕР·РґР°РЅРёРё РЅРѕРІС‹С… РѕР±СЉРµРєС‚РѕРІ
-zend_object_value version_create_handler(zend_class_entry *type TSRMLS_DC);
+//zend_object_value version_create_handler(zend_class_entry *type TSRMLS_DC);
 
 //С„СѓРЅРєС†РёСЏ РёРЅРёС†РёР°Р»РёР·Р°С†РёРё РєР»Р°СЃСЃР°. РґРѕР»Р¶РЅР° РІРєР»СЋС‡Р°С‚СЊСЃСЏ РІ
 //С„СѓРЅРєС†РёСЋ, РёРЅРёС†РёР°Р»РёР·Р°С†РёРё РјРѕРґСѓР»СЏ
Index: dllmain.cpp
===================================================================
--- dllmain.cpp	(revision 161471)
+++ dllmain.cpp	(working copy)
@@ -53,10 +53,10 @@
     attr_col_init(TSRMLS_C);
     signers_init(TSRMLS_C);
     recipients_init(TSRMLS_C);
-    sig_dat_init(TSRMLS_C);
-    hash_dat_init(TSRMLS_C);
+    signed_data_init(TSRMLS_C);
+    hashed_data_init(TSRMLS_C);
     raw_sig_init(TSRMLS_C);
-    sig_xml_init(TSRMLS_C);
+    signed_xml_init(TSRMLS_C);
     symmetric_algorithm_init(TSRMLS_C);
 
     REGISTER_LONG_CONSTANT("MEMORY_STORE", 0, CONST_CS | CONST_PERSISTENT);
Index: stdafx.h
===================================================================
--- stdafx.h	(revision 161471)
+++ stdafx.h	(working copy)
@@ -15,6 +15,21 @@
 #define RETURN_ATL_STRINGL RETURN_ATL_STRINGL_W
 #endif
 
+/* C99 requires these for C++ to get the definitions
+ * of INT64_MAX and other macros used by Zend/zend_long.h
+ * C11 drops this requirement, so these effectively
+ * just backport that piece of behavior.
+ */
+#ifdef __cplusplus
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS
+# endif
+# ifndef __STDC_CONSTANT_MACROS
+#  define __STDC_CONSTANT_MACROS
+# endif
+#endif
+
+
 #include <iostream>
 #include <memory> //Этот хедер тут нужен что бы компилить с новыми версиями libstdc++
                   //в них есть конфликт с __in и __out макросами которые определены в MS хедерах.
@@ -82,7 +97,7 @@
     str = (char *)ecalloc(len + 1, sizeof(char));\
     wcstombs(str, atlstr, len);\
     str[len] = '\0';\
-    RETURN_STRING(str, 0)\
+    RETURN_STRING(str)\
     }
 
 #define RETURN_ATL_STRINGL_W(atlstr)\
@@ -92,7 +107,7 @@
     len = atlstr.GetLength();\
     str = (char *)ecalloc(len, sizeof(char));\
     wcstombs(str, atlstr, len);\
-    RETURN_STRINGL(str, len, 0)\
+    RETURN_STRINGL(str, len)\
     }
 
 #define RETURN_ATL_STRING_A(atlstr)\
@@ -103,7 +118,7 @@
     str = (char *)ecalloc(len + 1, sizeof(char));\
     memcpy(str, atlstr, len);\
     str[len] = '\0';\
-    RETURN_STRING(str, 0)\
+    RETURN_STRING(str)\
     }
 
 #define RETURN_ATL_STRINGL_A(atlstr)\
@@ -113,7 +128,7 @@
     len = atlstr.GetLength();\
     str = (char *)ecalloc(len, sizeof(char));\
     memcpy(str, atlstr, len);\
-    RETURN_STRINGL(str, len, 0)\
+    RETURN_STRINGL(str, len)\
     }
 
 #define RETURN_PROXY_STRING(prstr)\
@@ -123,7 +138,7 @@
     len = strlen(prstr.c_str());\
     str = (char *)ecalloc(len + 1, sizeof(char));\
     strncpy(str, prstr.c_str(), len + 1);\
-    RETURN_STRING(str, 0)\
+    RETURN_STRING(str)\
     }
 
 #ifdef UNIX //разные макросы ибо на линуксе нет  _vscwprintf() который нужен внутри AppendFormat().
