	int		     	Loc;
	GSM_DateTime	    	Date,Date2;
	time_t		  	timet1, timet2;
	unsignedstring	  	Buffer,Buffer2;
	GSM_CalendarSubEntry    *SubEntry, *Text = NULL, *Location = NULL;
	GSM_CalendarSubEntry    *Phone = NULL, *DateStart = NULL, *Alarm = NULL, *DateEnd = NULL;
	int		    	RepeatEach = -1, RepeatDOW = -1, RepeatDay = -1, RepeatMonth = -1;
	unsigned int	    	diff;
	GSM_Error	       	error;
	unsigned char	   	req[54] = {
		NOKIA_FRAME1, 0x65,
		0x00,				   	/* 0 = calendar, 1 = todo	       */
		0x00, 0x00, 0x00,
		0x00, 0x00,			     	/* location			     */
		0x00, 0x00, 0x00, 0x00,
		0xFF, 0xFF, 0xFF, 0xFF,		 	/* alarm				*/
		0x80, 0x00, 0x00,
		0x01,				   	/* note icon			    */
		0xFF, 0xFF, 0xFF, 0xFF,		 	/* alarm type			   */
		0x00,				   	/* 0x02 or 0x00			 */
		0x01,				   	/* note type			    */
		0x07, 0xD0, 0x01, 0x12, 0x0C, 0x00,     /* start date/time		      */
		0x07, 0xD0, 0x01, 0x12, 0x0C, 0x00,     /* end date/time			*/
		0x00, 0x00,			     	/* recurrance			   */
		0x00, 0x00,			     	/* birth year			   */
		0x20,				   	/* ToDo priority			*/
		0x00,				   	/* ToDo completed ?		     */
		0x00, 0x00,			     	/* How many times repeat cal note or 0  */
		0x00,
		0x00,				   	/* note text length		     */
		0x00,				   	/* phone length/meeting place	   */
		0x00, 0x00, 0x00};
	int NoteID;

	SubEntry = NULL;
	while (Entry->GetNext(&SubEntry) == TRUE) {
		switch (SubEntry->GetType()) {
		case Calendar_Text_Text:
			Text = SubEntry;
			break;
		case Calendar_Text_Phone:
			Phone = SubEntry;
			break;
		case Calendar_Text_Location:
			Location = SubEntry;
			break;
		case Calendar_DateTime_Start:
			DateStart = SubEntry;
			break;
		case Calendar_DateTime_End:
			DateEnd = SubEntry;
			break;
		case Calendar_DateTime_ToneAlarm:
		case Calendar_DateTime_SilentAlarm:
			Alarm = SubEntry;
			break;
		case Calendar_Int_Repeat_Frequency:
			RepeatEach = SubEntry->GetInt();
			break;
		case Calendar_Int_Repeat_DayOfWeek:
			RepeatDOW = SubEntry->GetInt();
			break;		  
		case Calendar_Int_Repeat_Day:
			RepeatDay = SubEntry->GetInt();
			break;
		case Calendar_Int_Repeat_Month:
			RepeatMonth = SubEntry->GetInt();
			break;
		}
	}

	if (DateStart == NULL) return GSM_Return_Error(GSM_ERR_UNKNOWN);

	error = FindCalendarNoteType3(Entry, &NoteID);
	if (error.Code!=GSM_ERR_NONE) return error;
	req[21] = NoteID;

	error=GetFirstCalendarPos3(&Loc);
	if (error.Code!=GSM_ERR_NONE) return error;
	req[8] = Loc/256;
	req[9] = Loc%256;

	switch(Entry->Type) {
		case Calendar_Type_Reminder : req[27]=0x00; req[26]=0x02; break;
		case Calendar_Type_Meeting  : req[27]=0x01; break;
		case Calendar_Type_Call     : req[27]=0x02; break;
		case Calendar_Type_Birthday : req[27]=0x04; break;
		case Calendar_Type_Memo     : req[27]=0x08; break;
		default		     : return GSM_Return_Error(GSM_ERR_NOT_SUPPORTED);
	}

	memcpy(&Date,DateStart->GetDateTime(),sizeof(GSM_DateTime));
	req[28] = Date.Year / 256;
	req[29] = Date.Year % 256;
	req[30] = Date.Month;
	req[31] = Date.Day;
	req[32] = Date.Hour;
	req[33] = Date.Minute;

	if (Entry->Type == Calendar_Type_Birthday) {
		error = GetDateTime(&Date2);
		switch (error.Code) {
			case GSM_ERR_EMPTY:
			case GSM_ERR_NOT_SUPPORTED:
//			      GSM_GetCurrentDateTime(&Date2);
				return error;
				break;
			case GSM_ERR_NONE:
				break;
			default:
				return error;
		}
		req[28] = Date2.Year / 256;
		req[29] = Date2.Year % 256;
		if (Date.Year == 0) {
			req[42] = 0xff;
			req[43] = 0xff;
		} else {
			req[42] = Date.Year / 256;
			req[43] = Date.Year % 256;
		}
	}

	if (DateEnd != NULL) memcpy(&Date,DateEnd->GetDateTime(),sizeof(GSM_DateTime));

	req[34] = Date.Year / 256;
	req[35] = Date.Year % 256;
	req[36] = Date.Month;
	req[37] = Date.Day;
	req[38] = Date.Hour;
	req[39] = Date.Minute;
	if (Entry->Type == Calendar_Type_Birthday) {
		req[34] = Date2.Year / 256;
		req[35] = Date2.Year % 256;
	}

	//recurrance
	NokiaSetCalendarRecurranceRepeat(*Debug, Entry, req+40, req+52);

	if (Alarm != NULL) {
		memcpy(&Date,DateStart->GetDateTime(),sizeof(GSM_DateTime));

		if (Alarm->GetType() == Calendar_DateTime_SilentAlarm) {
			req[22] = 0x00; req[23] = 0x00; req[24] = 0x00; req[25] = 0x00;
		}
		if (Entry->Type == Calendar_Type_Birthday) Date.Year = Date2.Year;
		timet2   = GSMDateTime2TimeT(&Date);
		timet1   = GSMDateTime2TimeT(Alarm->GetDateTime()); 
		diff     = (timet2-timet1)/60;

		req[14] = diff / (256*256*256);
		req[15] = diff / (256*256);
		req[16] = diff / 256;
		req[17] = diff % 256;
	}

	if (Text != NULL) {
		req[49] = UnicodeLength(Text->GetText());
		NokiaSetUnicodeString(Text->GetText(),&Buffer);
	}

	if (Phone != NULL && Entry->Type == Calendar_Type_Call) {
		req[50] = UnicodeLength(Phone->GetText());
		NokiaSetUnicodeString(Phone->GetText(),&Buffer);
	}

	if (Location != NULL && Entry->Type == Calendar_Type_Meeting) {
		if ((*Phones)->Feature("cal62")==TRUE || (*Phones)->Feature("cal65")==TRUE ||
		    (*Phones)->Feature("cal35")==TRUE) {
		} else {
			req[50] = UnicodeLength(Location->GetText());
			NokiaSetUnicodeString(Location->GetText(),&Buffer);
		}
	}

	Buffer.push_back(0x00);

	Buffer2.append((const unsigned char*)req,sizeof(req));
	Buffer2.append((const unsigned char*)Buffer.data(),Buffer.size());

	(*Debug)->Deb("SENT: Adding todo (method 2)\n");
	return Write((unsigned char *)Buffer2.data(), Buffer2.size(), 0x13, 4, ID_AddCalendar+ID,Entry);
