diff --git a/Android.bp b/Android.bp
deleted file mode 100644
index db3a956..0000000
--- a/Android.bp
+++ /dev/null
@@ -1,78 +0,0 @@
-cc_library_shared {
-    // FIXME: this should only be -impl for a passthrough hal.
-    // In most cases, to convert this to a binderized implementation, you should:
-    // - change '-impl' to '-service' here and make it a cc_binary instead of a
-    //   cc_library_shared.
-    // - add a *.rc file for this module.
-    // - delete HIDL_FETCH_I* functions.
-    // - call configureRpcThreadpool and registerAsService on the instance.
-    // You may also want to append '-impl/-service' with a specific identifier like
-    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
-    name: "android.hardware.secure_element@1.0-impl-gto",
-    //relative_install_path: "hw",
-    // FIXME: this should be 'vendor: true' for modules that will eventually be
-    // on AOSP.
-    vendor: true,
-    srcs: [
-        "esehal/src/checksum.c",
-        "esehal/src/iso7816_t1.c",
-        "esehal/src/libse-gto.c",
-        "esehal/src/spi.c",
-        "esehal/src/transport.c",
-        "esehal/src/log.c",
-        "SecureElement.cpp",
-        "SecureElementHalCallback.cpp",
-    ],
-
-    local_include_dirs: [
-        "esehal/src",
-    ],
-
-    cflags: [
-        "-DANDROID",
-        "-DENABLE_LOGGING=1",
-        "-DENABLE_DEBUG=1",
-        "-DBUILDCFG=1",
-        "-DNXP_EXTNS=TRUE",
-        "-Wno-unused-parameter",
-        "-Wno-unused-private-field",
-        "-Wno-error",
-    ],
-
-    shared_libs: [
-        "libbase",
-        "libcutils",
-        "libhardware",
-        "libhidlbase",
-        "libhidltransport",
-        "libhwbinder",
-        "liblog",
-        "libutils",
-        "android.hardware.secure_element@1.0",
-    ],
-
-}
-
-cc_binary {
-    name: "android.hardware.secure_element@1.0-service-gto",
-    relative_install_path: "hw",
-    init_rc: ["android.hardware.secure_element@1.0-service-gto.rc"],
-    vendor: true,
-    defaults: ["hidl_defaults"],
-    srcs: [
-        "GtoService.cpp",
-    ],
-
-    shared_libs: [
-        "android.hardware.secure_element@1.0",
-        "android.hardware.secure_element@1.0-impl-gto",
-        "libbase",
-        "libcutils",
-        "libhardware",
-        "libhidlbase",
-        "libhidltransport",
-        "libhwbinder",
-        "liblog",
-        "libutils",
-    ],
-}
diff --git a/libse-gto-hal.conf b/libse-gto-hal.conf
deleted file mode 100644
index 80e47c2..0000000
--- a/libse-gto-hal.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-#Gemalto SPI devnode
-GTO_DEV=/dev/gto;
diff --git a/pax_global_header b/pax_global_header
deleted file mode 100644
index da6a5e8..0000000
--- a/pax_global_header
+++ /dev/null
@@ -1 +0,0 @@
-52 comment=0c4de3711ddb2e7ffbf45df90eb6fd4c73efcc7e
diff --git a/GtoService.cpp b/secure_element/1.0/GtoService.cpp
similarity index 95%
rename from GtoService.cpp
rename to secure_element/1.0/GtoService.cpp
index 0ef2a7d..d696ec4 100644
--- a/GtoService.cpp
+++ b/secure_element/1.0/GtoService.cpp
@@ -26,7 +26,7 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Gemalto Secure Element HAL Service 1.0.5 is starting. libse-gto v1.11");
+  ALOGD("Gemalto Secure Element HAL Service 1.0.0 is starting. libse-gto v1.11");
   sp<ISecureElement> se_service = new SecureElement();
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
diff --git a/README b/secure_element/1.0/README
similarity index 100%
rename from README
rename to secure_element/1.0/README
diff --git a/SecureElement.cpp b/secure_element/1.0/SecureElement.cpp
similarity index 96%
rename from SecureElement.cpp
rename to secure_element/1.0/SecureElement.cpp
index 903f071..0f89232 100644
--- a/SecureElement.cpp
+++ b/secure_element/1.0/SecureElement.cpp
@@ -51,7 +51,7 @@
 
 SecureElement::SecureElement(){
     nbrOpenChannel = 0;
-	ctx = NULL;
+    ctx = NULL;
 }
 
 void SecureElement::resetSE(){
@@ -136,6 +136,7 @@
 
 Return<void> SecureElement::getAtr(getAtr_cb _hidl_cb) {
     hidl_vec<uint8_t> response;
+    response.resize(atr_size);
     memcpy(&response[0], atr, atr_size);
     _hidl_cb(response);
     return Void();
@@ -179,8 +180,8 @@
         ALOGE("SecureElement:%s: transmit failed! No channel is open", __func__);
     }
     _hidl_cb(result);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -235,8 +236,8 @@
         }
         mSecureElementStatus = SecureElementStatus::IOERROR;
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     } else if (resp[resp_len - 2] == 0x90 && resp[resp_len - 1] == 0x00) {
@@ -252,14 +253,14 @@
             mSecureElementStatus = SecureElementStatus::IOERROR;
         }
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     }
 
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     ALOGD("SecureElement:%s Free memory after manage channel", __func__);
     ALOGD("SecureElement:%s mSecureElementStatus = %d", __func__, (int)mSecureElementStatus);
 
@@ -327,8 +328,8 @@
     _hidl_cb(resApduBuff, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after selectApdu", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -403,8 +404,8 @@
     _hidl_cb(result, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after openBasicChannel", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -451,8 +452,8 @@
         } else {
             mSecureElementStatus = SecureElementStatus::FAILED;
         }
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
     }
 
     if (nbrOpenChannel == 0 && isBasicChannelOpen == false) {
@@ -471,31 +472,31 @@
     const uint8_t *s = p;
     char *msg;
     int len = 0;
-	int input_len = n;
+    int input_len = n;
 
-    msg = (char*) malloc ( 100000 * sizeof(char));
-	if (!msg) {
-		errno = ENOMEM;
-		return -1;
+
+    msg = (char*) malloc ( input_len * 3 * sizeof(char));
+    if(!msg) {
+        errno = ENOMEM;
+        return;
     }
 
-
     if (pf) {
         len += sprintf(msg , "%s" , pf);
         //len = len + 8;
     }
-    while (n--) {
+    while (input_len--) {
         len += sprintf(msg + len, "%02X" , *s++);
         //len = len + 2;
-        if (n && sep) {
+        if (input_len && sep) {
             len += sprintf(msg + len, ":");
             //len++;
         }
     }
     sprintf(msg + len, "\n");
-    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, input_len, msg);
+    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, n, msg);
 
-	free(msg);
+    if(msg) free(msg);
 }
 
 int
@@ -619,12 +620,13 @@
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
         } else {
-			ctx = NULL;
+            ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
             isBasicChannelOpen = false;
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
+        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
diff --git a/SecureElement.h b/secure_element/1.0/SecureElement.h
similarity index 95%
rename from SecureElement.h
rename to secure_element/1.0/SecureElement.h
index ca55916..e63c3a8 100644
--- a/SecureElement.h
+++ b/secure_element/1.0/SecureElement.h
@@ -35,7 +35,7 @@
 struct SecureElement : public ISecureElement , public hidl_death_recipient {
     // Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
     SecureElement();
-    Return<void> init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init(const sp<V1_0::ISecureElementHalCallback>& clientCallback) override;
     Return<void> openLogicalChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openLogicalChannel_cb _hidl_cb) override;
     Return<void> openBasicChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openBasicChannel_cb _hidl_cb) override;
     Return<void> getAtr(getAtr_cb _hidl_cb) override;
diff --git a/SecureElementHalCallback.cpp b/secure_element/1.0/SecureElementHalCallback.cpp
similarity index 100%
rename from SecureElementHalCallback.cpp
rename to secure_element/1.0/SecureElementHalCallback.cpp
diff --git a/SecureElementHalCallback.h b/secure_element/1.0/SecureElementHalCallback.h
similarity index 100%
rename from SecureElementHalCallback.h
rename to secure_element/1.0/SecureElementHalCallback.h
diff --git a/android.hardware.secure_element@1.0-service-gto.rc b/secure_element/1.0/android.hardware.secure_element@1.0-service-gto.rc
similarity index 100%
rename from android.hardware.secure_element@1.0-service-gto.rc
rename to secure_element/1.0/android.hardware.secure_element@1.0-service-gto.rc
diff --git a/esehal/src/.gitignore b/secure_element/1.0/esehal/src/.gitignore
similarity index 100%
rename from esehal/src/.gitignore
rename to secure_element/1.0/esehal/src/.gitignore
diff --git a/esehal/src/Makefile.am b/secure_element/1.0/esehal/src/Makefile.am
similarity index 100%
rename from esehal/src/Makefile.am
rename to secure_element/1.0/esehal/src/Makefile.am
diff --git a/esehal/src/checksum.c b/secure_element/1.0/esehal/src/checksum.c
similarity index 100%
rename from esehal/src/checksum.c
rename to secure_element/1.0/esehal/src/checksum.c
diff --git a/esehal/src/checksum.h b/secure_element/1.0/esehal/src/checksum.h
similarity index 100%
rename from esehal/src/checksum.h
rename to secure_element/1.0/esehal/src/checksum.h
diff --git a/esehal/src/compiler.h b/secure_element/1.0/esehal/src/compiler.h
similarity index 100%
rename from esehal/src/compiler.h
rename to secure_element/1.0/esehal/src/compiler.h
diff --git a/secure_element/1.0/esehal/src/gpio.c b/secure_element/1.0/esehal/src/gpio.c
new file mode 100644
index 0000000..f4b007c
--- /dev/null
+++ b/secure_element/1.0/esehal/src/gpio.c
@@ -0,0 +1,190 @@
+/*****************************************************************************
+ * Copyright ©2017-2019 Gemalto – a Thales Company. All rights Reserved.
+ *
+ * This copy is licensed under the Apache License, Version 2.0 (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *     http://www.apache.org/licenses/LICENSE-2.0 or https://www.apache.org/licenses/LICENSE-2.0.html 
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and limitations under the License.
+
+ ****************************************************************************/
+
+/**
+ * @file
+ * $Author$
+ * $Revision$
+ * $Date$
+ *
+ * Low level interface to SPI/eSE driver.
+ *
+ */
+
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/se_gemalto.h>
+
+#include "libse-gto-private.h"
+#include "gpio.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+ 
+#define IN  0
+#define OUT 1
+ 
+#define LOW  0
+#define HIGH 1
+
+//#define POUT 493  /* Hikey 960 board config == gpio493 -- GPIO_021 -- Pin 34 */
+#define POUT 452  /* Hikey 960 board config == gpio452 -- GPIO_060 -- Pin 5 */
+ 
+static int
+GPIOExport(struct se_gto_ctx *ctx, int pin)
+{
+#define BUFFER_MAX 3
+	char buffer[BUFFER_MAX];
+	ssize_t bytes_written;
+	int fd;
+ 
+	fd = open("/sys/class/gpio/export", O_WRONLY);
+	if (-1 == fd) {
+		err("Failed to open export for writing!\n");
+		return(-1);
+	}
+ 
+	bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin);
+	write(fd, buffer, bytes_written);
+	close(fd);
+	return(0);
+}
+ 
+static int
+GPIOUnexport(struct se_gto_ctx *ctx, int pin)
+{
+	char buffer[BUFFER_MAX];
+	ssize_t bytes_written;
+	int fd;
+ 
+	fd = open("/sys/class/gpio/unexport", O_WRONLY);
+	if (-1 == fd) {
+		err("Failed to open unexport for writing!\n");
+		return(-1);
+	}
+ 
+	bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin);
+	write(fd, buffer, bytes_written);
+	close(fd);
+	return(0);
+}
+ 
+static int
+GPIODirection(struct se_gto_ctx *ctx, int pin, int dir)
+{
+	static const char s_directions_str[]  = "in\0out";
+ 
+#define DIRECTION_MAX 35
+	char path[DIRECTION_MAX];
+	int fd;
+ 
+	snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin);
+	fd = open(path, O_WRONLY);
+	if (-1 == fd) {
+		err("Failed to open gpio direction for writing!\n");
+		return(-1);
+	}
+ 
+	if (-1 == write(fd, &s_directions_str[IN == dir ? 0 : 3], IN == dir ? 2 : 3)) {
+		err("Failed to set direction!\n");
+		return(-1);
+	}
+ 
+	close(fd);
+	return(0);
+}
+
+static int
+GPIOWrite(struct se_gto_ctx *ctx, int pin, int value)
+{
+#define VALUE_MAX 30
+	static const char s_values_str[] = "01";
+ 
+	char path[VALUE_MAX];
+	int fd;
+ 
+	snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin);
+	fd = open(path, O_WRONLY);
+	if (-1 == fd) {
+		err("Failed to open gpio value for writing!\n");
+		return(-1);
+	}
+ 
+	if (1 != write(fd, &s_values_str[LOW == value ? 0 : 1], 1)) {
+		err("Failed to write value!\n");
+		return(-1);
+	}
+ 
+	close(fd);
+	return(0);
+}
+
+int
+gpio_set_power_on(struct se_gto_ctx *ctx)
+{
+    
+    /*
+     * Enable GPIO pins
+     */
+    if (-1 == GPIOExport(ctx, POUT))
+        return(1);
+ 
+    /*
+     * Set GPIO directions
+     */
+    if (-1 == GPIODirection(ctx, POUT, OUT))
+        return(2);
+
+    /*
+     * Write GPIO value 0 to indicate switch power ON
+     */
+    if (-1 == GPIOWrite(ctx, POUT, 1))
+        return(3);
+
+    /*ctx->t1.spi_fd = open(ctx->gtodev, O_RDWR);
+    if (ctx->t1.spi_fd < 0) {
+        err("cannot use %s for spi device\n", ctx->gtodev);
+        return -1;
+    }
+    return ctx->t1.spi_fd < 0;*/
+    return 0;
+}
+
+int
+gpio_set_power_off(struct se_gto_ctx *ctx)
+{
+    /*
+     * Write GPIO value 0 to indicate switch power OFF
+     */
+    if (-1 == GPIOWrite(ctx, POUT, 0))
+        return(3);
+
+    /*
+     * Disable GPIO pins
+     */
+    if (-1 == GPIOUnexport(ctx, POUT))
+        return(4);
+
+    /*if (ctx->t1.spi_fd >= 0)
+        if (close(ctx->t1.spi_fd) < 0)
+            warn("failed to close fd to %s, %s.\n", ctx->gtodev, strerror(errno));
+    ctx->t1.spi_fd = -1;
+    return 0;*/
+    return 0;
+}
diff --git a/secure_element/1.0/esehal/src/gpio.h b/secure_element/1.0/esehal/src/gpio.h
new file mode 100644
index 0000000..7ae5f01
--- /dev/null
+++ b/secure_element/1.0/esehal/src/gpio.h
@@ -0,0 +1,30 @@
+/*****************************************************************************
+ * Copyright ©2017-2019 Gemalto – a Thales Company. All rights Reserved.
+ *
+ * This copy is licensed under the Apache License, Version 2.0 (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *     http://www.apache.org/licenses/LICENSE-2.0 or https://www.apache.org/licenses/LICENSE-2.0.html 
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and limitations under the License.
+
+ ****************************************************************************/
+
+/**
+ * @file
+ * $Author$
+ * $Revision$
+ * $Date$
+ *
+ * Interface to transport to transparently send/receive data.
+ *
+ */
+
+#ifndef GPIO_H
+#define GPIO_H
+
+int gpio_set_power_on(struct se_gto_ctx *ctx);
+int gpio_set_power_off(struct se_gto_ctx *ctx);
+
+#endif /* GPIO_H */
diff --git a/esehal/src/iso7816_t1.c b/secure_element/1.0/esehal/src/iso7816_t1.c
similarity index 100%
rename from esehal/src/iso7816_t1.c
rename to secure_element/1.0/esehal/src/iso7816_t1.c
diff --git a/esehal/src/iso7816_t1.h b/secure_element/1.0/esehal/src/iso7816_t1.h
similarity index 100%
rename from esehal/src/iso7816_t1.h
rename to secure_element/1.0/esehal/src/iso7816_t1.h
diff --git a/esehal/src/libse-gto-private.h b/secure_element/1.0/esehal/src/libse-gto-private.h
similarity index 100%
rename from esehal/src/libse-gto-private.h
rename to secure_element/1.0/esehal/src/libse-gto-private.h
diff --git a/esehal/src/libse-gto.c b/secure_element/1.0/esehal/src/libse-gto.c
similarity index 97%
rename from esehal/src/libse-gto.c
rename to secure_element/1.0/esehal/src/libse-gto.c
index 5260173..b87dc5c 100644
--- a/esehal/src/libse-gto.c
+++ b/secure_element/1.0/esehal/src/libse-gto.c
@@ -238,13 +238,13 @@
 {
     int status = 0;
 
-    dbg("se_gto_close check_alive = %d\n", ctx->check_alive);
+    if(ctx) dbg("se_gto_close check_alive = %d\n", ctx->check_alive);
     if (ctx->check_alive == 1)
         if (gtoSPI_checkAlive(ctx) != 0) status = 0xDEAD;
 
     (void)isot1_release(&ctx->t1);
     (void)spi_teardown(ctx);
     log_teardown(ctx);
-    if (ctx) free(ctx);
+    if(ctx) free(ctx);
     return status;
 }
diff --git a/esehal/src/libse-gto.pc.in b/secure_element/1.0/esehal/src/libse-gto.pc.in
similarity index 100%
rename from esehal/src/libse-gto.pc.in
rename to secure_element/1.0/esehal/src/libse-gto.pc.in
diff --git a/esehal/src/linux/se_gemalto.h b/secure_element/1.0/esehal/src/linux/se_gemalto.h
similarity index 100%
rename from esehal/src/linux/se_gemalto.h
rename to secure_element/1.0/esehal/src/linux/se_gemalto.h
diff --git a/esehal/src/log.c b/secure_element/1.0/esehal/src/log.c
similarity index 100%
rename from esehal/src/log.c
rename to secure_element/1.0/esehal/src/log.c
diff --git a/esehal/src/log.h b/secure_element/1.0/esehal/src/log.h
similarity index 100%
rename from esehal/src/log.h
rename to secure_element/1.0/esehal/src/log.h
diff --git a/esehal/src/se-gto/libse-gto.h b/secure_element/1.0/esehal/src/se-gto/libse-gto.h
similarity index 100%
rename from esehal/src/se-gto/libse-gto.h
rename to secure_element/1.0/esehal/src/se-gto/libse-gto.h
diff --git a/esehal/src/spi.c b/secure_element/1.0/esehal/src/spi.c
similarity index 100%
rename from esehal/src/spi.c
rename to secure_element/1.0/esehal/src/spi.c
diff --git a/esehal/src/spi.h b/secure_element/1.0/esehal/src/spi.h
similarity index 100%
rename from esehal/src/spi.h
rename to secure_element/1.0/esehal/src/spi.h
diff --git a/esehal/src/transport.c b/secure_element/1.0/esehal/src/transport.c
similarity index 100%
rename from esehal/src/transport.c
rename to secure_element/1.0/esehal/src/transport.c
diff --git a/esehal/src/transport.h b/secure_element/1.0/esehal/src/transport.h
similarity index 100%
rename from esehal/src/transport.h
rename to secure_element/1.0/esehal/src/transport.h
diff --git a/secure_element/1.0/libse-gto-hal.conf b/secure_element/1.0/libse-gto-hal.conf
new file mode 100644
index 0000000..a4abb64
--- /dev/null
+++ b/secure_element/1.0/libse-gto-hal.conf
@@ -0,0 +1,2 @@
+#Gemalto SPI devnode
+GTO_DEV=/dev/spidev0.0;
diff --git a/GtoService.cpp b/secure_element/1.1/GtoService.cpp
similarity index 78%
copy from GtoService.cpp
copy to secure_element/1.1/GtoService.cpp
index 0ef2a7d..3425343 100644
--- a/GtoService.cpp
+++ b/secure_element/1.1/GtoService.cpp
@@ -10,15 +10,15 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.1/ISecureElement.h>
 #include <hidl/LegacySupport.h>
 #include <log/log.h>
 
 #include "SecureElement.h"
 
 // Generated HIDL files
-using android::hardware::secure_element::V1_0::ISecureElement;
-using android::hardware::secure_element::V1_0::implementation::SecureElement;
+using android::hardware::secure_element::V1_1::ISecureElement;
+using android::hardware::secure_element::V1_1::implementation::SecureElement;
 using android::hardware::configureRpcThreadpool;
 using android::hardware::joinRpcThreadpool;
 using android::OK;
@@ -26,7 +26,8 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Gemalto Secure Element HAL Service 1.0.5 is starting. libse-gto v1.11");
+  ALOGD("android::hardware::secure_element::V1_1 is starting.");
+  ALOGD("Thales Secure Element HAL Service Release 1.1.0 ==> libse-gto v1.11");
   sp<ISecureElement> se_service = new SecureElement();
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
@@ -37,7 +38,7 @@
     return -1;
   }
   
-  ALOGD("Gemalto Secure Element Service is ready");
+  ALOGD("Thales Secure Element Service is ready");
   joinRpcThreadpool();
   return 1;
 }
diff --git a/SecureElement.cpp b/secure_element/1.1/SecureElement.cpp
similarity index 89%
copy from SecureElement.cpp
copy to secure_element/1.1/SecureElement.cpp
index 903f071..96b7cce 100644
--- a/SecureElement.cpp
+++ b/secure_element/1.1/SecureElement.cpp
@@ -32,7 +32,7 @@
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_1 {
 namespace implementation {
 
 #ifndef MAX_CHANNELS
@@ -51,7 +51,7 @@
 
 SecureElement::SecureElement(){
     nbrOpenChannel = 0;
-	ctx = NULL;
+    ctx = NULL;
 }
 
 void SecureElement::resetSE(){
@@ -72,6 +72,7 @@
 }
 
 sp<V1_0::ISecureElementHalCallback> SecureElement::internalClientCallback = nullptr;
+sp<V1_1::ISecureElementHalCallback> SecureElement::internalClientCallback_v1_1 = nullptr;
 int SecureElement::initializeSE() {
 
     //struct settings *settings;
@@ -99,14 +100,16 @@
     checkSeUp = true;
     turnOffSE = false;
 
-    internalClientCallback->onStateChange(true);
+
+    if(internalClientCallback_v1_1 != nullptr) internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
+    else internalClientCallback->onStateChange(true);
+
     turnOffSE = true;
 
     ALOGD("SecureElement:%s end", __func__);
     return EXIT_SUCCESS;
 }
 
-// Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
 Return<void> SecureElement::init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) {
 
     ALOGD("SecureElement:%s start", __func__);
@@ -115,6 +118,7 @@
         return Void();
     } else {
         internalClientCallback = clientCallback;
+        internalClientCallback_v1_1 = nullptr;
         if (!internalClientCallback->linkToDeath(this, 0)) {
             ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
         }
@@ -134,8 +138,37 @@
     return Void();
 }
 
+Return<void> SecureElement::init_1_1(const sp<::android::hardware::secure_element::V1_1::ISecureElementHalCallback>& clientCallback) {
+
+    ALOGD("SecureElement:%s start", __func__);
+    if (clientCallback == nullptr) {
+        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        return Void();
+    } else {
+        internalClientCallback = nullptr;
+        internalClientCallback_v1_1 = clientCallback;
+        if (!internalClientCallback_v1_1->linkToDeath(this, 0)) {
+            ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
+        }
+    }
+
+    if (initializeSE() != EXIT_SUCCESS) {
+        ALOGE("SecureElement:%s initializeSE Failed", __func__);
+        clientCallback->onStateChange_1_1(false, "initializeSE Failed");
+        return Void();
+    }
+
+    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
+        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
+    }
+    ALOGD("SecureElement:%s end", __func__);
+
+    return Void();
+}
+
 Return<void> SecureElement::getAtr(getAtr_cb _hidl_cb) {
     hidl_vec<uint8_t> response;
+    response.resize(atr_size);
     memcpy(&response[0], atr, atr_size);
     _hidl_cb(response);
     return Void();
@@ -179,8 +212,8 @@
         ALOGE("SecureElement:%s: transmit failed! No channel is open", __func__);
     }
     _hidl_cb(result);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -235,8 +268,8 @@
         }
         mSecureElementStatus = SecureElementStatus::IOERROR;
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     } else if (resp[resp_len - 2] == 0x90 && resp[resp_len - 1] == 0x00) {
@@ -252,14 +285,14 @@
             mSecureElementStatus = SecureElementStatus::IOERROR;
         }
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     }
 
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     ALOGD("SecureElement:%s Free memory after manage channel", __func__);
     ALOGD("SecureElement:%s mSecureElementStatus = %d", __func__, (int)mSecureElementStatus);
 
@@ -327,8 +360,8 @@
     _hidl_cb(resApduBuff, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after selectApdu", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -403,8 +436,8 @@
     _hidl_cb(result, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after openBasicChannel", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -451,8 +484,8 @@
         } else {
             mSecureElementStatus = SecureElementStatus::FAILED;
         }
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
     }
 
     if (nbrOpenChannel == 0 && isBasicChannelOpen == false) {
@@ -471,31 +504,31 @@
     const uint8_t *s = p;
     char *msg;
     int len = 0;
-	int input_len = n;
+    int input_len = n;
 
-    msg = (char*) malloc ( 100000 * sizeof(char));
-	if (!msg) {
-		errno = ENOMEM;
-		return -1;
+
+    msg = (char*) malloc ( input_len * 3 * sizeof(char));
+    if(!msg) {
+        errno = ENOMEM;
+        return;
     }
 
-
     if (pf) {
         len += sprintf(msg , "%s" , pf);
         //len = len + 8;
     }
-    while (n--) {
+    while (input_len--) {
         len += sprintf(msg + len, "%02X" , *s++);
         //len = len + 2;
-        if (n && sep) {
+        if (input_len && sep) {
             len += sprintf(msg + len, ":");
             //len++;
         }
     }
     sprintf(msg + len, "\n");
-    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, input_len, msg);
+    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, n, msg);
 
-	free(msg);
+    if(msg) free(msg);
 }
 
 int
@@ -606,6 +639,11 @@
   }
   if (internalClientCallback != nullptr) {
     internalClientCallback->unlinkToDeath(this);
+    internalClientCallback = nullptr;
+  }
+  if (internalClientCallback_v1_1 != nullptr) {
+    internalClientCallback_v1_1->unlinkToDeath(this);
+    internalClientCallback_v1_1 = nullptr;
   }
 }
 
@@ -619,12 +657,13 @@
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
         } else {
-			ctx = NULL;
+            ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
             isBasicChannelOpen = false;
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
+        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
diff --git a/SecureElement.h b/secure_element/1.1/SecureElement.h
similarity index 77%
copy from SecureElement.h
copy to secure_element/1.1/SecureElement.h
index ca55916..90596e0 100644
--- a/SecureElement.h
+++ b/secure_element/1.1/SecureElement.h
@@ -10,17 +10,18 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
-#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
+#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
 
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.0/types.h>
+#include <android/hardware/secure_element/1.1/ISecureElement.h>
 #include <hidl/MQDescriptor.h>
 #include <hidl/Status.h>
 
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_1 {
 namespace implementation {
 
 using ::android::hardware::hidl_array;
@@ -30,12 +31,15 @@
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::sp;
+using ::android::hardware::secure_element::V1_0::LogicalChannelResponse;
+using ::android::hardware::secure_element::V1_0::SecureElementStatus;
+using ::android::hardware::secure_element::V1_1::ISecureElement;
 
 
 struct SecureElement : public ISecureElement , public hidl_death_recipient {
-    // Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
     SecureElement();
-    Return<void> init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init(const sp<V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init_1_1(const sp<V1_1::ISecureElementHalCallback>& clientCallback) override;
     Return<void> openLogicalChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openLogicalChannel_cb _hidl_cb) override;
     Return<void> openBasicChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openBasicChannel_cb _hidl_cb) override;
     Return<void> getAtr(getAtr_cb _hidl_cb) override;
@@ -44,7 +48,6 @@
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> closeChannel(uint8_t channelNumber) override;
 
 
-    // Methods from ::android::hidl::base::V1_0::IBase follow.
     private:
     uint8_t nbrOpenChannel = 0;
     bool isBasicChannelOpen = false;
@@ -53,6 +56,7 @@
     uint8_t atr[32];
     uint8_t atr_size;
     static sp<V1_0::ISecureElementHalCallback> internalClientCallback;
+    static sp<V1_1::ISecureElementHalCallback> internalClientCallback_v1_1;
     int initializeSE();
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> deinitializeSE();
     void serviceDied(uint64_t, const wp<IBase>&) override;
@@ -66,13 +70,11 @@
 
 };
 
-// FIXME: most likely delete, this is only for passthrough implementations
-// extern "C" ISecureElement* HIDL_FETCH_ISecureElement(const char* name);
 
 }  // namespace implementation
-}  // namespace V1_0
+}  // namespace V1_1
 }  // namespace secure_element
 }  // namespace hardware
 }  // namespace android
 
-#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
diff --git a/secure_element/1.1/android.hardware.secure_element@1.1-service-gto.rc b/secure_element/1.1/android.hardware.secure_element@1.1-service-gto.rc
new file mode 100644
index 0000000..f529d22
--- /dev/null
+++ b/secure_element/1.1/android.hardware.secure_element@1.1-service-gto.rc
@@ -0,0 +1,5 @@
+service gto_secure_element_hal_service_1_1 /vendor/bin/hw/android.hardware.secure_element@1.1-service-gto
+    class hal
+    user root
+    group root
+    seclabel u:r:su:s0
diff --git a/GtoService.cpp b/secure_element/1.2/GtoService.cpp
similarity index 69%
copy from GtoService.cpp
copy to secure_element/1.2/GtoService.cpp
index 0ef2a7d..c75d11e 100644
--- a/GtoService.cpp
+++ b/secure_element/1.2/GtoService.cpp
@@ -10,15 +10,15 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.2/ISecureElement.h>
 #include <hidl/LegacySupport.h>
 #include <log/log.h>
 
 #include "SecureElement.h"
 
 // Generated HIDL files
-using android::hardware::secure_element::V1_0::ISecureElement;
-using android::hardware::secure_element::V1_0::implementation::SecureElement;
+using android::hardware::secure_element::V1_2::ISecureElement;
+using android::hardware::secure_element::V1_2::implementation::SecureElement;
 using android::hardware::configureRpcThreadpool;
 using android::hardware::joinRpcThreadpool;
 using android::OK;
@@ -26,8 +26,10 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Gemalto Secure Element HAL Service 1.0.5 is starting. libse-gto v1.11");
+  ALOGD("android::hardware::secure_element::V1_2 is starting.");
+  ALOGD("Thales Secure Element HAL Service Release 1.2.0 ==> libse-gto v1.11");
   sp<ISecureElement> se_service = new SecureElement();
+  //sp<ISecureElement> se_service2 = new SecureElement();
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
   if (status != OK) {
@@ -36,8 +38,16 @@
         status);
     return -1;
   }
+
+  /*status_t status = se_service2->registerAsService("eSE2");
+  if (status != OK) {
+    LOG_ALWAYS_FATAL(
+        "registerAsService2 (%d).",
+        status);
+    return -1;
+  }*/
   
-  ALOGD("Gemalto Secure Element Service is ready");
+  ALOGD("Thales Secure Element Service is ready");
   joinRpcThreadpool();
   return 1;
 }
diff --git a/SecureElement.cpp b/secure_element/1.2/SecureElement.cpp
similarity index 87%
copy from SecureElement.cpp
copy to secure_element/1.2/SecureElement.cpp
index 903f071..60a9275 100644
--- a/SecureElement.cpp
+++ b/secure_element/1.2/SecureElement.cpp
@@ -32,7 +32,7 @@
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_2 {
 namespace implementation {
 
 #ifndef MAX_CHANNELS
@@ -51,10 +51,10 @@
 
 SecureElement::SecureElement(){
     nbrOpenChannel = 0;
-	ctx = NULL;
+    ctx = NULL;
 }
 
-void SecureElement::resetSE(){
+int SecureElement::resetSE(){
     int n;
 
     isBasicChannelOpen = false;
@@ -69,9 +69,12 @@
     } else {
         ALOGE("SecureElement:%s Failed to reset and get ATR: %s\n", __func__, strerror(errno));
     }
+
+    return n;
 }
 
 sp<V1_0::ISecureElementHalCallback> SecureElement::internalClientCallback = nullptr;
+sp<V1_1::ISecureElementHalCallback> SecureElement::internalClientCallback_v1_1 = nullptr;
 int SecureElement::initializeSE() {
 
     //struct settings *settings;
@@ -94,19 +97,21 @@
         return EXIT_FAILURE;
     }
 
-    resetSE();
+    if( resetSE() < 0) return EXIT_FAILURE;
 
     checkSeUp = true;
     turnOffSE = false;
 
-    internalClientCallback->onStateChange(true);
+
+    if(internalClientCallback_v1_1 != nullptr) internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
+    else internalClientCallback->onStateChange(true);
+
     turnOffSE = true;
 
     ALOGD("SecureElement:%s end", __func__);
     return EXIT_SUCCESS;
 }
 
-// Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
 Return<void> SecureElement::init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) {
 
     ALOGD("SecureElement:%s start", __func__);
@@ -115,6 +120,7 @@
         return Void();
     } else {
         internalClientCallback = clientCallback;
+        internalClientCallback_v1_1 = nullptr;
         if (!internalClientCallback->linkToDeath(this, 0)) {
             ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
         }
@@ -134,8 +140,37 @@
     return Void();
 }
 
+Return<void> SecureElement::init_1_1(const sp<::android::hardware::secure_element::V1_1::ISecureElementHalCallback>& clientCallback) {
+
+    ALOGD("SecureElement:%s start", __func__);
+    if (clientCallback == nullptr) {
+        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        return Void();
+    } else {
+        internalClientCallback = nullptr;
+        internalClientCallback_v1_1 = clientCallback;
+        if (!internalClientCallback_v1_1->linkToDeath(this, 0)) {
+            ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
+        }
+    }
+
+    if (initializeSE() != EXIT_SUCCESS) {
+        ALOGE("SecureElement:%s initializeSE Failed", __func__);
+        clientCallback->onStateChange_1_1(false, "initializeSE Failed");
+        return Void();
+    }
+
+    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
+        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
+    }
+    ALOGD("SecureElement:%s end", __func__);
+
+    return Void();
+}
+
 Return<void> SecureElement::getAtr(getAtr_cb _hidl_cb) {
     hidl_vec<uint8_t> response;
+    response.resize(atr_size);
     memcpy(&response[0], atr, atr_size);
     _hidl_cb(response);
     return Void();
@@ -179,8 +214,8 @@
         ALOGE("SecureElement:%s: transmit failed! No channel is open", __func__);
     }
     _hidl_cb(result);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -235,8 +270,8 @@
         }
         mSecureElementStatus = SecureElementStatus::IOERROR;
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     } else if (resp[resp_len - 2] == 0x90 && resp[resp_len - 1] == 0x00) {
@@ -252,14 +287,14 @@
             mSecureElementStatus = SecureElementStatus::IOERROR;
         }
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     }
 
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     ALOGD("SecureElement:%s Free memory after manage channel", __func__);
     ALOGD("SecureElement:%s mSecureElementStatus = %d", __func__, (int)mSecureElementStatus);
 
@@ -327,8 +362,8 @@
     _hidl_cb(resApduBuff, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after selectApdu", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -403,8 +438,8 @@
     _hidl_cb(result, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after openBasicChannel", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -451,8 +486,8 @@
         } else {
             mSecureElementStatus = SecureElementStatus::FAILED;
         }
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
     }
 
     if (nbrOpenChannel == 0 && isBasicChannelOpen == false) {
@@ -471,31 +506,31 @@
     const uint8_t *s = p;
     char *msg;
     int len = 0;
-	int input_len = n;
+    int input_len = n;
 
-    msg = (char*) malloc ( 100000 * sizeof(char));
-	if (!msg) {
-		errno = ENOMEM;
-		return -1;
+
+    msg = (char*) malloc ( input_len * 3 * sizeof(char));
+    if(!msg) {
+        errno = ENOMEM;
+        return;
     }
 
-
     if (pf) {
         len += sprintf(msg , "%s" , pf);
         //len = len + 8;
     }
-    while (n--) {
+    while (input_len--) {
         len += sprintf(msg + len, "%02X" , *s++);
         //len = len + 2;
-        if (n && sep) {
+        if (input_len && sep) {
             len += sprintf(msg + len, ":");
             //len++;
         }
     }
     sprintf(msg + len, "\n");
-    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, input_len, msg);
+    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, n, msg);
 
-	free(msg);
+    if(msg) free(msg);
 }
 
 int
@@ -606,6 +641,11 @@
   }
   if (internalClientCallback != nullptr) {
     internalClientCallback->unlinkToDeath(this);
+    internalClientCallback = nullptr;
+  }
+  if (internalClientCallback_v1_1 != nullptr) {
+    internalClientCallback_v1_1->unlinkToDeath(this);
+    internalClientCallback_v1_1 = nullptr;
   }
 }
 
@@ -619,12 +659,13 @@
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
         } else {
-			ctx = NULL;
+            ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
             isBasicChannelOpen = false;
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
+        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
@@ -634,6 +675,27 @@
     return mSecureElementStatus;
 }
 
+Return<::android::hardware::secure_element::V1_0::SecureElementStatus>
+SecureElement::reset() {
+
+  SecureElementStatus status = SecureElementStatus::FAILED;
+
+  ALOGD("SecureElement:%s start", __func__);
+  if (turnOffSE) {
+    
+
+    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
+        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
+    }
+    if(initializeSE() == EXIT_SUCCESS) {
+        status = SecureElementStatus::SUCCESS;
+    }
+  }
+  ALOGD("SecureElement:%s end", __func__);
+
+  return status;
+}
+
 // Methods from ::android::hidl::base::V1_0::IBase follow.
 
 //ISecureElement* HIDL_FETCH_ISecureElement(const char* /* name */) {
@@ -641,7 +703,7 @@
 //}
 //
 }  // namespace implementation
-}  // namespace V1_0
+}  // namespace V1_2
 }  // namespace secure_element
 }  // namespace hardware
 }  // namespace android
diff --git a/SecureElement.h b/secure_element/1.2/SecureElement.h
similarity index 74%
copy from SecureElement.h
copy to secure_element/1.2/SecureElement.h
index ca55916..9f03d39 100644
--- a/SecureElement.h
+++ b/secure_element/1.2/SecureElement.h
@@ -10,17 +10,18 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
-#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
+#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
 
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.0/types.h>
+#include <android/hardware/secure_element/1.2/ISecureElement.h>
 #include <hidl/MQDescriptor.h>
 #include <hidl/Status.h>
 
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_2 {
 namespace implementation {
 
 using ::android::hardware::hidl_array;
@@ -30,21 +31,24 @@
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::sp;
+using ::android::hardware::secure_element::V1_0::LogicalChannelResponse;
+using ::android::hardware::secure_element::V1_0::SecureElementStatus;
+using ::android::hardware::secure_element::V1_2::ISecureElement;
 
 
 struct SecureElement : public ISecureElement , public hidl_death_recipient {
-    // Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
     SecureElement();
-    Return<void> init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init(const sp<V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init_1_1(const sp<V1_1::ISecureElementHalCallback>& clientCallback) override;
     Return<void> openLogicalChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openLogicalChannel_cb _hidl_cb) override;
     Return<void> openBasicChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openBasicChannel_cb _hidl_cb) override;
     Return<void> getAtr(getAtr_cb _hidl_cb) override;
     Return<void> transmit(const hidl_vec<uint8_t>& data, transmit_cb _hidl_cb) override;
     Return<bool> isCardPresent() override;
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> closeChannel(uint8_t channelNumber) override;
+    Return<::android::hardware::secure_element::V1_0::SecureElementStatus> reset() override;
 
 
-    // Methods from ::android::hidl::base::V1_0::IBase follow.
     private:
     uint8_t nbrOpenChannel = 0;
     bool isBasicChannelOpen = false;
@@ -53,26 +57,25 @@
     uint8_t atr[32];
     uint8_t atr_size;
     static sp<V1_0::ISecureElementHalCallback> internalClientCallback;
+    static sp<V1_1::ISecureElementHalCallback> internalClientCallback_v1_1;
     int initializeSE();
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> deinitializeSE();
     void serviceDied(uint64_t, const wp<IBase>&) override;
     static int run_apdu(struct se_gto_ctx *ctx, const uint8_t *apdu, uint8_t *resp, int n, int verbose);
     static int toint(char c);
     static void dump_bytes(const char *pf, char sep, const uint8_t *p, int n, FILE *out);
-    void resetSE();
+    int resetSE();
     int openConfigFile(int verbose);
     int parseConfigFile(FILE *f, int verbose);
     
 
 };
 
-// FIXME: most likely delete, this is only for passthrough implementations
-// extern "C" ISecureElement* HIDL_FETCH_ISecureElement(const char* name);
 
 }  // namespace implementation
-}  // namespace V1_0
+}  // namespace V1_2
 }  // namespace secure_element
 }  // namespace hardware
 }  // namespace android
 
-#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_2_SECUREELEMENT_H
diff --git a/secure_element/1.2/android.hardware.secure_element@1.2-service-gto.rc b/secure_element/1.2/android.hardware.secure_element@1.2-service-gto.rc
new file mode 100644
index 0000000..8f082d9
--- /dev/null
+++ b/secure_element/1.2/android.hardware.secure_element@1.2-service-gto.rc
@@ -0,0 +1,5 @@
+service gto_secure_element_hal_service_1_2 /vendor/bin/hw/android.hardware.secure_element@1.2-service-gto
+    class hal
+    user root
+    group root
+    seclabel u:r:su:s0
diff --git a/secure_element/Android.bp b/secure_element/Android.bp
new file mode 100644
index 0000000..fbfd49f
--- /dev/null
+++ b/secure_element/Android.bp
@@ -0,0 +1,245 @@
+cc_library_shared {
+    // FIXME: this should only be -impl for a passthrough hal.
+    // In most cases, to convert this to a binderized implementation, you should:
+    // - change '-impl' to '-service' here and make it a cc_binary instead of a
+    //   cc_library_shared.
+    // - add a *.rc file for this module.
+    // - delete HIDL_FETCH_I* functions.
+    // - call configureRpcThreadpool and registerAsService on the instance.
+    // You may also want to append '-impl/-service' with a specific identifier like
+    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
+    name: "android.hardware.secure_element@1.0-impl-gto",
+    //relative_install_path: "hw",
+    // FIXME: this should be 'vendor: true' for modules that will eventually be
+    // on AOSP.
+    vendor: true,
+    srcs: [
+        "1.0/esehal/src/checksum.c",
+        "1.0/esehal/src/iso7816_t1.c",
+        "1.0/esehal/src/libse-gto.c",
+        "1.0/esehal/src/spi.c",
+        "1.0/esehal/src/transport.c",
+        "1.0/esehal/src/log.c",
+        "1.0/SecureElement.cpp",
+    ],
+
+    local_include_dirs: [
+        "1.0/esehal/src",
+    ],
+
+    cflags: [
+        "-DANDROID",
+        "-DENABLE_LOGGING=1",
+        "-DENABLE_DEBUG=1",
+        "-DBUILDCFG=1",
+        "-DNXP_EXTNS=TRUE",
+        "-Wno-unused-parameter",
+        "-Wno-unused-private-field",
+        "-Wno-error",
+        "-Wreturn-type",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+        "android.hardware.secure_element@1.0",
+    ],
+
+}
+
+cc_binary {
+    name: "android.hardware.secure_element@1.0-service-gto",
+    relative_install_path: "hw",
+    init_rc: ["1.0/android.hardware.secure_element@1.0-service-gto.rc"],
+    vendor: true,
+    defaults: ["hidl_defaults"],
+    srcs: [
+        "1.0/GtoService.cpp",
+    ],
+
+    shared_libs: [
+        "android.hardware.secure_element@1.0",
+        "android.hardware.secure_element@1.0-impl-gto",
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+    ],
+}
+
+cc_library_shared {
+    // FIXME: this should only be -impl for a passthrough hal.
+    // In most cases, to convert this to a binderized implementation, you should:
+    // - change '-impl' to '-service' here and make it a cc_binary instead of a
+    //   cc_library_shared.
+    // - add a *.rc file for this module.
+    // - delete HIDL_FETCH_I* functions.
+    // - call configureRpcThreadpool and registerAsService on the instance.
+    // You may also want to append '-impl/-service' with a specific identifier like
+    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
+    name: "android.hardware.secure_element@1.1-impl-gto",
+    //relative_install_path: "hw",
+    // FIXME: this should be 'vendor: true' for modules that will eventually be
+    // on AOSP.
+    vendor: true,
+    srcs: [
+        "1.0/esehal/src/checksum.c",
+        "1.0/esehal/src/iso7816_t1.c",
+        "1.0/esehal/src/libse-gto.c",
+        "1.0/esehal/src/spi.c",
+        "1.0/esehal/src/transport.c",
+        "1.0/esehal/src/log.c",
+        "1.1/SecureElement.cpp",
+    ],
+
+    local_include_dirs: [
+        "1.0/esehal/src",
+    ],
+
+    cflags: [
+        "-DANDROID",
+        "-DENABLE_LOGGING=1",
+        "-DENABLE_DEBUG=1",
+        "-DBUILDCFG=1",
+        "-DNXP_EXTNS=TRUE",
+        "-Wno-unused-parameter",
+        "-Wno-unused-private-field",
+        "-Wno-error",
+        "-Wreturn-type",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+        "android.hardware.secure_element@1.0",
+	"android.hardware.secure_element@1.1",
+    ],
+
+}
+
+cc_binary {
+    name: "android.hardware.secure_element@1.1-service-gto",
+    relative_install_path: "hw",
+    init_rc: ["1.1/android.hardware.secure_element@1.1-service-gto.rc"],
+    vendor: true,
+    defaults: ["hidl_defaults"],
+    srcs: [
+        "1.1/GtoService.cpp",
+    ],
+
+    shared_libs: [
+        "android.hardware.secure_element@1.0",
+        "android.hardware.secure_element@1.0-impl-gto",
+	"android.hardware.secure_element@1.1",
+        "android.hardware.secure_element@1.1-impl-gto",
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+    ],
+}
+
+cc_library_shared {
+    // FIXME: this should only be -impl for a passthrough hal.
+    // In most cases, to convert this to a binderized implementation, you should:
+    // - change '-impl' to '-service' here and make it a cc_binary instead of a
+    //   cc_library_shared.
+    // - add a *.rc file for this module.
+    // - delete HIDL_FETCH_I* functions.
+    // - call configureRpcThreadpool and registerAsService on the instance.
+    // You may also want to append '-impl/-service' with a specific identifier like
+    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
+    name: "android.hardware.secure_element@1.2-impl-gto",
+    //relative_install_path: "hw",
+    // FIXME: this should be 'vendor: true' for modules that will eventually be
+    // on AOSP.
+    vendor: true,
+    srcs: [
+        "1.0/esehal/src/checksum.c",
+        "1.0/esehal/src/iso7816_t1.c",
+        "1.0/esehal/src/libse-gto.c",
+        "1.0/esehal/src/spi.c",
+        "1.0/esehal/src/transport.c",
+        "1.0/esehal/src/log.c",
+        "1.2/SecureElement.cpp",
+    ],
+
+    local_include_dirs: [
+        "1.0/esehal/src",
+    ],
+
+    cflags: [
+        "-DANDROID",
+        "-DENABLE_LOGGING=1",
+        "-DENABLE_DEBUG=1",
+        "-DBUILDCFG=1",
+        "-DNXP_EXTNS=TRUE",
+        "-Wno-unused-parameter",
+        "-Wno-unused-private-field",
+        "-Wno-error",
+        "-Wreturn-type",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+        "android.hardware.secure_element@1.0",
+	"android.hardware.secure_element@1.1",
+	"android.hardware.secure_element@1.2",
+    ],
+
+}
+
+cc_binary {
+    name: "android.hardware.secure_element@1.2-service-gto",
+    relative_install_path: "hw",
+    init_rc: ["1.2/android.hardware.secure_element@1.2-service-gto.rc"],
+    vendor: true,
+    defaults: ["hidl_defaults"],
+    srcs: [
+        "1.2/GtoService.cpp",
+    ],
+
+    shared_libs: [
+        "android.hardware.secure_element@1.0",
+        "android.hardware.secure_element@1.0-impl-gto",
+	"android.hardware.secure_element@1.1",
+        "android.hardware.secure_element@1.1-impl-gto",
+        "android.hardware.secure_element@1.2",
+        "android.hardware.secure_element@1.2-impl-gto",
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+    ],
+}
