diff --git a/app/containers/MessageBox/index.tsx b/app/containers/MessageBox/index.tsx
index 9fe3d11a1..fbcf24cd2 100644
--- a/app/containers/MessageBox/index.tsx
+++ b/app/containers/MessageBox/index.tsx
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
 import { Alert, Keyboard, NativeModules, Text, View } from 'react-native';
 import { connect } from 'react-redux';
 import { KeyboardAccessoryView } from 'react-native-ui-lib/keyboard';
-import ImagePicker from 'react-native-image-crop-picker';
+import ImagePicker, { Image, ImageOrVideo } from 'react-native-image-crop-picker';
 import { dequal } from 'dequal';
 import DocumentPicker from 'react-native-document-picker';
 import { Q } from '@nozbe/watermelondb';
@@ -27,7 +27,7 @@ import LeftButtons from './LeftButtons';
 // @ts-ignore
 // eslint-disable-next-line import/extensions,import/no-unresolved
 import RightButtons from './RightButtons';
-import { isAndroid, isTablet } from '../../utils/deviceInfo';
+import { isAndroid, isIOS, isTablet } from '../../utils/deviceInfo';
 import { canUploadFile } from '../../utils/media';
 import EventEmiter from '../../utils/events';
 import { KEY_COMMAND, handleCommandShowUpload, handleCommandSubmit, handleCommandTyping } from '../../commands';
@@ -54,15 +54,16 @@ if (isAndroid) {
 
 const imagePickerConfig = {
 	cropping: true,
-	compressImageQuality: 0.8,
 	avoidEmptySpaceAroundImage: false,
-	freeStyleCropEnabled: true
+	freeStyleCropEnabled: true,
+	forceJpg: true
 };
 
 const libraryPickerConfig = {
 	multiple: true,
 	compressVideoPreset: 'Passthrough',
-	mediaType: 'any'
+	mediaType: 'any',
+	forceJpg: true
 };
 
 const videoPickerConfig = {
@@ -129,6 +130,18 @@ interface IMessageBoxState {
 	permissionToUpload: boolean;
 }
 
+const forceJpgExtension = (attachment: ImageOrVideo) => {
+	if (isIOS && attachment.mime === 'image/jpeg' && attachment.filename) {
+		const regex = new RegExp(/.heic$/i);
+		if (attachment.filename.match(regex)) {
+			attachment.filename = attachment.filename.replace(regex, '.jpg');
+		} else {
+			attachment.filename += '.jpg';
+		}
+	}
+	return attachment;
+};
+
 class MessageBox extends Component<IMessageBoxProps, IMessageBoxState> {
 	private text: string;
 
@@ -692,7 +705,8 @@ class MessageBox extends Component<IMessageBoxProps, IMessageBoxState> {
 	takePhoto = async () => {
 		logEvent(events.ROOM_BOX_ACTION_PHOTO);
 		try {
-			const image = await ImagePicker.openCamera(this.imagePickerConfig);
+			let image = (await ImagePicker.openCamera(this.imagePickerConfig)) as Image;
+			image = forceJpgExtension(image);
 			if (this.canUploadFile(image)) {
 				this.openShareView([image]);
 			}
@@ -716,7 +730,8 @@ class MessageBox extends Component<IMessageBoxProps, IMessageBoxState> {
 	chooseFromLibrary = async () => {
 		logEvent(events.ROOM_BOX_ACTION_LIBRARY);
 		try {
-			const attachments = await ImagePicker.openPicker(this.libraryPickerConfig);
+			let attachments = (await ImagePicker.openPicker(this.libraryPickerConfig)) as ImageOrVideo[];
+			attachments = attachments.map(att => forceJpgExtension(att));
 			this.openShareView(attachments);
 		} catch (e) {
 			logEvent(events.ROOM_BOX_ACTION_LIBRARY_F);
diff --git a/app/definitions/INotification.ts b/app/definitions/INotification.ts
index 77467d9d7..4974b0c91 100644
--- a/app/definitions/INotification.ts
+++ b/app/definitions/INotification.ts
@@ -9,4 +9,5 @@ export interface INotification {
 	from: string;
 	image: string;
 	soundname: string;
+	getData: () => INotification;
 }
diff --git a/app/notifications/push/index.ts b/app/notifications/push/index.ts
index af25c9eed..09fa86027 100644
--- a/app/notifications/push/index.ts
+++ b/app/notifications/push/index.ts
@@ -16,9 +16,10 @@ interface IEjson {
 	messageId: string;
 }
 
-export const onNotification = (notification: INotification): void => {
-	if (notification) {
+export const onNotification = (push: INotification): void => {
+	if (push) {
 		try {
+			const notification = push?.getData();
 			const { rid, name, sender, type, host, messageType, messageId }: IEjson = EJSON.parse(notification.ejson);
 
 			const types: Record<string, string> = {
diff --git a/app/notifications/push/push.ios.ts b/app/notifications/push/push.ios.ts
index 92c2d3a6c..a6b1118c5 100644
--- a/app/notifications/push/push.ios.ts
+++ b/app/notifications/push/push.ios.ts
@@ -22,7 +22,7 @@ class PushNotification {
 			// TODO REDUX MIGRATION TO TS
 			const { background } = reduxStore.getState().app;
 			if (background) {
-				this.onNotification(notification?.getData());
+				this.onNotification(notification);
 			}
 			completion();
 		});
diff --git a/app/notifications/push/push.ts b/app/notifications/push/push.ts
index 16aa8cf5c..11eccbcb5 100644
--- a/app/notifications/push/push.ts
+++ b/app/notifications/push/push.ts
@@ -16,7 +16,7 @@ class PushNotification {
 		});
 
 		NotificationsAndroid.setNotificationOpenedListener((notification: Notification) => {
-			this.onNotification(notification?.getData());
+			this.onNotification(notification);
 		});
 	}
 
diff --git a/app/utils/room.ts b/app/utils/room.ts
index 3e4e0ef44..d39e40490 100644
--- a/app/utils/room.ts
+++ b/app/utils/room.ts
@@ -60,6 +60,6 @@ export const getBadgeColor = ({
 };
 
 export const makeThreadName = (messageRecord: { id?: string; msg?: string; attachments?: IAttachment[] }): string | undefined =>
-	messageRecord.msg || messageRecord.attachments![0].title;
+	messageRecord.msg || messageRecord?.attachments?.[0]?.title;
 
 export const isTeamRoom = ({ teamId, joined }: { teamId: string; joined: boolean }): boolean => !!teamId && joined;
diff --git a/app/views/ThreadMessagesView/index.tsx b/app/views/ThreadMessagesView/index.tsx
index 230a6778d..2b53159bf 100644
--- a/app/views/ThreadMessagesView/index.tsx
+++ b/app/views/ThreadMessagesView/index.tsx
@@ -284,7 +284,7 @@ class ThreadMessagesView extends React.Component<IThreadMessagesViewProps, IThre
 			if (update && update.length) {
 				update = update.map(m => buildMessage(m));
 				// filter threads
-				threadsToCreate = update.filter(i1 => allThreadsRecords.find((i2: { id: string }) => i1._id === i2.id));
+				threadsToCreate = update.filter(i1 => !allThreadsRecords.find((i2: { id: string }) => i1._id === i2.id));
 				threadsToUpdate = allThreadsRecords.filter((i1: { id: string }) => update.find(i2 => i1.id === i2._id));
 				threadsToCreate = threadsToCreate.map(thread =>
 					threadsCollection.prepareCreate(