Support HAL v1.1 and 1.2
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",
+    ],
+}