diff --git a/device/device-xiaomi-tissot/APKBUILD b/device/device-xiaomi-tissot/APKBUILD
index 0dce7025738c324d64a93cf026b287bf100b3204..c2ea6268837c92073a6734d9c98064c26398a674 100644
--- a/device/device-xiaomi-tissot/APKBUILD
+++ b/device/device-xiaomi-tissot/APKBUILD
@@ -2,15 +2,15 @@
 pkgname="device-xiaomi-tissot"
 pkgdesc="Xiaomi A1"
 pkgver=0.1
-pkgrel=0
+pkgrel=1
 url="https://postmarketos.org"
 license="MIT"
 arch="aarch64"
 options="!check !archcheck"
 depends="postmarketos-base linux-xiaomi-tissot mkbootimg mesa-dri-swrast msm-fb-refresher"
 makedepends="devicepkg-dev"
-source="deviceinfo
-"
+source="deviceinfo"
+subpackages="$pkgname-nonfree-firmware:nonfree_firmware"
 
 build() {
 	devicepkg_build $startdir $pkgname
@@ -20,4 +20,10 @@ package() {
 	devicepkg_package $startdir $pkgname
 }
 
+nonfree_firmware() {
+	pkgdesc="Firmware for xiaomi-tissot"
+	depends="linux-firmware-qcom firmware-xiaomi-tissot"
+	mkdir "$subpkgdir"
+}
+
 sha512sums="176aa6496dd4bc335fec4ba986348390b60233ba303d3b170650dbe3020e2a15438ca8708f2d9e5fc92e9dc8f3301fe7ba0f8840e953e4591a7bd7da22c0b459  deviceinfo"
diff --git a/device/linux-xiaomi-tissot/APKBUILD b/device/linux-xiaomi-tissot/APKBUILD
index 46bebd439308be750b642e9f4be1c5febb9e6c53..28b313eb3ec2548e73e438e3d0083b4f1ba5e438 100644
--- a/device/linux-xiaomi-tissot/APKBUILD
+++ b/device/linux-xiaomi-tissot/APKBUILD
@@ -3,7 +3,7 @@
 
 pkgname="linux-xiaomi-tissot"
 pkgver=3.18.71
-pkgrel=1
+pkgrel=2
 pkgdesc="Xiaomi A1 kernel fork"
 arch="aarch64"
 _carch="arm64"
@@ -39,6 +39,7 @@ source="
 	init-ignore-dm-if-skip_initramfs.patch
 	tweak-warn-once-skb_release_head_state.patch
 	fix-xorg-mdss-update-fb-info.patch
+	fix-ramoops-header.patch
 "
 builddir="$srcdir/${_repository}-${_commit}"
 
@@ -90,4 +91,5 @@ b408f157cc025d410b38f5aee9be977e670e1ac3f195f6c3a6681446fa0c3887067d62a4f729cfcd
 32f8180ae59351835f91ead8e38ae4933658c13bfe62bdbb32de82aecb16e1ff9e96333f4f129423ae8be4dc3210ee3bbf3fd0ea199df0f397ecb2f2efe37bcb  init-reverse-skip_initramfs.patch
 d97b343970bba978b0c99222e01d3a66abba9d7fe5725705021b4ab2895dd18df2c68bfbb894f05f2894714b958e1aa63ed5e09d19cbbff1204fdc7f246891b4  init-ignore-dm-if-skip_initramfs.patch
 170a979908156f740d32fc3a8f74c2b2cb54420e12b81f2373fed1eb095159f1e03d3c24116a345f41ccd927fd93594b0a0e4b58a57ffe6869288f1ec030078c  tweak-warn-once-skb_release_head_state.patch
-a277af28a718f5caf94257005393aa92d62c96110a8ec6368ff62f2e0d871b69c56c4ce00174db637204d53fa63ad3a79b8d6141713dca0878e1f06fe0379caa  fix-xorg-mdss-update-fb-info.patch"
+a277af28a718f5caf94257005393aa92d62c96110a8ec6368ff62f2e0d871b69c56c4ce00174db637204d53fa63ad3a79b8d6141713dca0878e1f06fe0379caa  fix-xorg-mdss-update-fb-info.patch
+5abf30392e44372a01936ba59d9f392e835632fbd2356a4c50997652cd5c4ad4c142814145ab9263367558668a3b6cf5600886cd69d3108e6bd0718de10b0b6e  fix-ramoops-header.patch"
diff --git a/device/linux-xiaomi-tissot/fix-ramoops-header.patch b/device/linux-xiaomi-tissot/fix-ramoops-header.patch
new file mode 100644
index 0000000000000000000000000000000000000000..abc4e999c53b271cd5ceeaeaee113771aaa8bf7e
--- /dev/null
+++ b/device/linux-xiaomi-tissot/fix-ramoops-header.patch
@@ -0,0 +1,88 @@
+The ramoops driver prepends a "====timestamp.timestamp-C|D\n"
+header to the compressed record before handing it over to pstore
+driver which doesn't know about the header. In pstore_decompress(),
+the pstore driver reads the first "==" as a zlib header, so the
+decompression always fails. For example, this causes the driver
+to write /dev/pstore/dmesg-ramoops-0.enc.z instead of
+/dev/pstore/dmesg-ramoops-0.
+
+This patch makes the ramoops driver remove the header before
+pstore decompression.
+
+Signed-off-by: Ben Zhang <benzh@chromium.org>
+---
+ fs/pstore/ram.c | 22 +++++++++++++++-------
+ 1 file changed, 15 insertions(+), 7 deletions(-)
+
+diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
+index 3b57443..ec881b3 100644
+--- a/fs/pstore/ram.c
++++ b/fs/pstore/ram.c
+@@ -135,25 +135,27 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], uint *c, uint max,
+ 	return prz;
+ }
+ 
+-static void ramoops_read_kmsg_hdr(char *buffer, struct timespec *time,
++static int ramoops_read_kmsg_hdr(char *buffer, struct timespec *time,
+ 				  bool *compressed)
+ {
+ 	char data_type;
++	int header_length = 0;
+ 
+-	if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lu.%lu-%c\n",
+-			&time->tv_sec, &time->tv_nsec, &data_type) == 3) {
++	if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lu.%lu-%c\n%n", &time->tv_sec,
++			&time->tv_nsec, &data_type, &header_length) == 3) {
+ 		if (data_type == 'C')
+ 			*compressed = true;
+ 		else
+ 			*compressed = false;
+-	} else if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lu.%lu\n",
+-			&time->tv_sec, &time->tv_nsec) == 2) {
++	} else if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lu.%lu\n%n",
++			&time->tv_sec, &time->tv_nsec, &header_length) == 2) {
+ 			*compressed = false;
+ 	} else {
+ 		time->tv_sec = 0;
+ 		time->tv_nsec = 0;
+ 		*compressed = false;
+ 	}
++	return header_length;
+ }
+ 
+ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
+@@ -165,6 +167,7 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
+ 	ssize_t ecc_notice_size;
+ 	struct ramoops_context *cxt = psi->data;
+ 	struct persistent_ram_zone *prz;
++	int header_length;
+ 
+ 	prz = ramoops_get_next_prz(cxt->przs, &cxt->dump_read_cnt,
+ 				   cxt->max_dump_cnt, id, type,
+@@ -178,7 +181,13 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
+ 	if (!prz)
+ 		return 0;
+ 
++	if (!persistent_ram_old(prz))
++		return 0;
++
+ 	size = persistent_ram_old_size(prz);
++	header_length = ramoops_read_kmsg_hdr(persistent_ram_old(prz), time,
++			compressed);
++	size -= header_length;
+ 
+ 	/* ECC correction notice */
+ 	ecc_notice_size = persistent_ram_ecc_string(prz, NULL, 0);
+@@ -187,8 +196,7 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
+ 	if (*buf == NULL)
+ 		return -ENOMEM;
+ 
+-	memcpy(*buf, persistent_ram_old(prz), size);
+-	ramoops_read_kmsg_hdr(*buf, time, compressed);
++	memcpy(*buf, (char *)persistent_ram_old(prz) + header_length, size);
+ 	persistent_ram_ecc_string(prz, *buf + size, ecc_notice_size + 1);
+ 
+ 	return size + ecc_notice_size;
+-- 
+2.1.0.rc2.206.gedb03e5
+
diff --git a/firmware/firmware-xiaomi-tissot/APKBUILD b/firmware/firmware-xiaomi-tissot/APKBUILD
new file mode 100644
index 0000000000000000000000000000000000000000..7b26f3001c2aab1133f57f73f759c46d16bc6085
--- /dev/null
+++ b/firmware/firmware-xiaomi-tissot/APKBUILD
@@ -0,0 +1,45 @@
+pkgname=firmware-xiaomi-tissot
+pkgver=1
+pkgrel=0
+pkgdesc="Firmware files for Xiaomi Mi A1"
+url="https://postmarketos.org"
+arch="aarch64"
+license="proprietary"
+depends="wcnss-wlan"
+options="!strip !check !archcheck"
+
+# Source
+_files="
+	wcnss.b00 wcnss.b01 wcnss.b02 wcnss.b04 wcnss.b06
+	wcnss.b09 wcnss.b10 wcnss.b11 wcnss.b12 wcnss.mdt 
+	adsp.b00 adsp.b01 adsp.b02 adsp.b03 adsp.b04
+	adsp.b05 adsp.b06 adsp.b07 adsp.b08 adsp.b09
+	adsp.b10 adsp.b11 adsp.b12 adsp.b13 adsp.mdt
+	qdsp6m.qdb
+	a506_zap.b00 a506_zap.b01 a506_zap.b02 a506_zap.mdt
+"
+_files_prima="
+	WCNSS_wlan_dictionary.dat
+	WCNSS_qcom_cfg.ini
+	WCNSS_qcom_wlan_nv.bin
+"
+_commit="98cc201f4cef4372298206bc910a6599a95cd258"
+source="$pkgname-$_commit.tar.gz::https://gitlab.com/IonAgorria/postmarketos-vendor-xiaomi-tissot/-/archive/$_commit/postmarketos-vendor-xiaomi-tissot-$_commit.tar.gz"
+
+package() {
+	cd "$srcdir/postmarketos-vendor-xiaomi-tissot-${_commit}"
+
+	# /lib/firmware/postmarketos
+	for _i in $_files; do
+		install -D -m644 "$_i" \
+			"$pkgdir/lib/firmware/postmarketos/$_i"
+	done
+
+	# /lib/firmware/postmarketos/wlan/prima
+	for _i in $_files_prima; do
+		install -D -m644 "wlan/prima/$_i" \
+			"$pkgdir/lib/firmware/postmarketos/wlan/prima/$_i"
+	done
+}
+
+sha512sums="c459d6bf893ff62e6b4b96f4e4cafc3dcf7ac08bab99b8df577ad637b4714fb7fbfddf6cb1ab657bd59bc3c18715239a2117659b099fbd92e14b585f1400b179  firmware-xiaomi-tissot-98cc201f4cef4372298206bc910a6599a95cd258.tar.gz"