loggingservices/eventlogger/test/src/t_logview2.cpp
changeset 0 08ec8eefde2f
child 9 667e88a979d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/test/src/t_logview2.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,6916 @@
+// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <s32file.h>
+#include <logeng.h>
+#include <tz.h>
+#include "TEST.H"
+#include <logview.h>
+
+#undef test  //there is a "test" macro which hides "RTest test" declaration.
+
+RTest test(_L("Log View Test Harness Number 2"));
+
+const TInt KTestEventNum = 20;
+const TInt KTestErrorEventNum = 3;
+const TLogContactItemId KTestContact1 = 0x123;
+const TLogContactItemId KTestContact2 = 0x456;
+const TLogContactItemId KTestContact3 = 0x789;
+_LIT(KTestDirection1, "Direction Test 1");
+_LIT(KTestDirection2, "Direction Test 2");
+_LIT(KTestDirection3, "Direction Test 3");
+_LIT(KTestNumber1, "Number Test 1");
+_LIT(KTestNumber2, "Number Test 2");
+_LIT(KTestNumber3, "Number Test 3");
+_LIT(KTestRemote1, "Remote Test 1");
+_LIT(KTestRemote2, "Remote Test 2");
+_LIT(KTestRemote3, "Remote Test 3");
+_LIT(KTestStatus1, "Status Test 1");
+_LIT(KTestStatus2, "Status Test 2");
+_LIT(KTestStatus3, "Status Test 3");
+_LIT(KTestSubject, "Test Subject");
+const TLogLink KTestLink = 0x123456;
+_LIT8(KTestData, "Test data");
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0930
+@SYMTestCaseDesc	    Tests for the functionality of CLogViewEvent,CLogFilter classes
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for event view after setting filter on the views.
+                        Change the filter list configuration and test for the view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestEventViewWithFilterListL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0930 "));
+	CTestActive* active = new(ELeave)CTestActive;
+	CleanupStack::PushL(active);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetContact(KTestContact1);
+	event->SetDirection(KTestDirection1);
+	event->SetDurationType(KLogDurationNone);
+	event->SetNumber(KTestNumber1);
+	event->SetRemoteParty(KTestRemote1);
+	event->SetStatus(KTestStatus1);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetEventType(KLogDataEventTypeUid);
+	event->SetContact(KTestContact2);
+	event->SetDirection(KTestDirection2);
+	event->SetDurationType(KLogDurationValid);
+	event->SetNumber(KTestNumber2);
+	event->SetRemoteParty(KTestRemote2);
+	event->SetStatus(KTestStatus2);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetEventType(KLogFaxEventTypeUid);
+	event->SetContact(KTestContact3);
+	event->SetDirection(KTestDirection3);
+	event->SetDurationType(KLogDurationData);
+	event->SetNumber(KTestNumber3);
+	event->SetRemoteParty(KTestRemote3);
+	event->SetStatus(KTestStatus3);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogFilterList* list = new(ELeave)CLogFilterList;
+	CleanupStack::PushL(list);
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(),1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+	filter->SetRemoteParty(KTestRemote2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+	filter->SetRemoteParty(KTestRemote3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+	filter->SetStatus(KTestStatus1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+	filter->SetRemoteParty(KTestRemote2);
+	filter->SetStatus(KTestStatus2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+	filter->SetRemoteParty(KTestRemote3);
+	filter->SetStatus(KTestStatus3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	CleanupStack::PopAndDestroy(4); // list, view, event, active
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-3432
+@SYMTestCaseDesc	    Test the functionality of CLogViewEvent::SetFilterL with the CLogFilterList parameter containing multiple filters with start time and end time.
+@SYMTestPriority 	    High
+@SYMTestActions  	    1. Add 2 events.
+						2. Setup a CLogFilterList with two filters targeting the first event. Both filters have start and end time. Call SetFilterL.
+						3. Verify view has 1 event and no LogServ panic.
+						4. Clear the filter list.
+						5. Setup filter for first event with start and end time. Call SetFilterL.
+						6. Verify view has one event.
+                        7. Setup second filter for second event with start and end time. Append this filter to filter list and call SetFilterL.
+						8. Verify view has 2 events and no LogServ panic.
+@SYMTestExpectedResults Log view has expected number of events and no LogServ panic.
+@SYMDEF                 INC102412
+*/
+LOCAL_C void TestEventViewWithTimestampsInFilterListL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-3432 "));
+	TTime testStartTime;
+	testStartTime.UniversalTime();
+	TTime tomorrow = testStartTime + (TTimeIntervalDays)1;
+	TTime twoDaysFromNow = tomorrow + (TTimeIntervalDays)1;
+
+	CTestActive* active = new(ELeave)CTestActive;
+	CleanupStack::PushL(active);
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(tomorrow, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	// Wait a second before adding events to log.
+	User::After(1100000);
+
+	// Add two events to log
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	// Add event 1
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetContact(KTestContact1);
+	event->SetDirection(KTestDirection1);
+	event->SetDurationType(KLogDurationNone);
+	event->SetNumber(KTestNumber1);
+	event->SetRemoteParty(KTestRemote1);
+	event->SetStatus(KTestStatus1);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Add event 2
+	event->SetEventType(KLogDataEventTypeUid);
+	event->SetContact(KTestContact2);
+	event->SetDirection(KTestDirection2);
+	event->SetDurationType(KLogDurationValid);
+	event->SetNumber(KTestNumber2);
+	event->SetRemoteParty(KTestRemote2);
+	event->SetStatus(KTestStatus2);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Setup filter
+	CLogFilterList* list = new(ELeave)CLogFilterList;
+	CleanupStack::PushL(list);
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set half a filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetStartTime(testStartTime);
+	TTime t1 = filter->StartTime();
+	TEST(t1 == testStartTime);
+	filter->SetEndTime(tomorrow);
+	TTime t2 = filter->EndTime();
+	TEST(t2 == tomorrow);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// set the other half of filter for event 1
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+	filter->SetStatus(KTestStatus1);
+
+	// start time is duplicate of previous filter, 
+	// end time is not duplicate
+	filter->SetStartTime(testStartTime);
+	filter->SetEndTime(twoDaysFromNow);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(),1);
+
+	list->ResetAndDestroy();
+
+	// check contents of the event.
+	TBool res = view->FirstL(active->iStatus);
+	TEST(res);
+	active->StartL();
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	TEST2(view->Event().Contact(), KTestContact1);
+	TEST( view->Event().Number() == KTestNumber1);
+	TEST( view->Event().Status() == KTestStatus1);
+	TEST( view->Event().RemoteParty() == KTestRemote1);
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+	filter->SetStatus(KTestStatus1);
+	filter->SetStartTime(testStartTime);
+	filter->SetEndTime(tomorrow);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+	filter->SetRemoteParty(KTestRemote2);
+	filter->SetStatus(KTestStatus2);
+
+	// start time is duplicate,
+	// end time is not duplicate
+	filter->SetStartTime(testStartTime);
+	filter->SetEndTime(twoDaysFromNow);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active->StartL();
+	TEST(view->SetFilterL(*list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	list->ResetAndDestroy();
+
+	// check contents of event 2 (most recent)
+	res = view->FirstL(active->iStatus);
+	TEST(res);
+	active->StartL();
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	TEST2(view->Event().Contact(), KTestContact2);
+	TEST( view->Event().Number() == KTestNumber2);
+	TEST( view->Event().Status() == KTestStatus2);
+	TEST( view->Event().RemoteParty() == KTestRemote2);
+
+	// check contents of event 1 (older)
+	res = view->NextL(active->iStatus);
+	TEST(res);
+	active->StartL();
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	TEST2(view->Event().Contact(), KTestContact1);
+	TEST( view->Event().Number() == KTestNumber1);
+	TEST( view->Event().Status() == KTestStatus1);
+	TEST( view->Event().RemoteParty() == KTestRemote1);
+
+	CleanupStack::PopAndDestroy(4); // list, view, event, active
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0931
+@SYMTestCaseDesc	    Tests for recent view list with filters 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for recent view list,with different settings of the filter. 
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestRecentViewWithFilterL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0931 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetNumber(_L("1"));
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationData);
+	event->SetNumber(_L("2"));
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetStatus(KTestStatus1);
+	event->SetNumber(_L("3"));
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetContact(KTestContact1);
+	event->SetNumber(_L("4"));
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 4);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	// This should make no difference
+	filter->SetEventType(KLogCallEventTypeUid);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 4);
+
+	// This should make no difference
+	filter->SetDirection(buf);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 4);
+
+	filter->SetDurationType(KLogDurationData);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 3);
+
+	filter->SetStatus(KTestStatus1);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 2);
+
+	filter->SetContact(KTestContact1);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter->SetStatus(_L("Dummy"));
+	TEST(!view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+
+	CleanupStack::PopAndDestroy(4); // filter, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0932
+@SYMTestCaseDesc	    Tests for recent view list with filter set for the view
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for recent view list set by the specified set of filters.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestRecentViewWithFilterListL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0932 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetDurationType(KLogDurationNone);
+	event->SetContact(KTestContact1);
+	event->SetStatus(KTestStatus1);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationValid);
+	event->SetContact(KTestContact2);
+	event->SetStatus(KTestStatus2);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationData);
+	event->SetContact(KTestContact3);
+	event->SetStatus(KTestStatus3);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 3);
+
+	CLogFilterList* list = new(ELeave)CLogFilterList;
+	CleanupStack::PushL(list);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetStatus(KTestStatus1);
+	filter->SetContact(KTestContact1);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetStatus(KTestStatus2);
+	filter->SetContact(KTestContact2);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	filter->SetDurationType(KLogDurationData);
+	filter->SetStatus(KTestStatus3);
+	filter->SetContact(KTestContact3);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 3);
+
+	list->ResetAndDestroy();
+	CleanupStack::PopAndDestroy(4); // list, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0933
+@SYMTestCaseDesc	    Tests for duplicate event view with filter 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for duplicate event view count. 
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestDuplicateViewWithFilterL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0933 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetContact(KTestContact1);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationValid);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetStatus(KTestStatus1);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationNone);
+	event->SetStatus(KNullDesC);
+
+	// Add event - This will be the entry in recent list
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId logId1 = event->Id();
+
+	// Should only be one event in recent list - the rest are duplicates
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	
+	TLogRecentList recentList = view->RecentList();
+	TEST(recentList == KLogRecentIncomingCalls);
+
+	// Check duplicate count
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 3);
+	
+	TLogId logId2 = duplicate->Source();
+	TEST(logId1 == logId2);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 3);
+
+	filter->SetDurationType(KLogDurationValid);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 2);
+
+	filter->SetStatus(KTestStatus1);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+
+	filter->SetStatus(KTestStatus2);
+	TEST(!view->DuplicatesL(*duplicate, *filter, active->iStatus));
+
+	CleanupStack::PopAndDestroy(5); // filter, duplicate, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0934
+@SYMTestCaseDesc	    Tests for duplicate event view with filter list
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for duplicate event view count,set by the specified set of filters.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestDuplicateViewWithFilterListL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0934 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetContact(KTestContact1);
+
+	event->SetDurationType(KLogDurationNone);
+	event->SetStatus(KNullDesC);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationValid);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationData);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Final event will be most recent
+	event->SetDurationType(KLogDurationNone);
+	event->SetStatus(KNullDesC);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogFilterList* list = new(ELeave)CLogFilterList;
+	CleanupStack::PushL(list);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 3);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	filter->SetDurationType(KLogDurationValid);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	filter->SetDurationType(KLogDurationData);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *list, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 2);
+
+	list->ResetAndDestroy();
+	CleanupStack::PopAndDestroy(5); // list, duplicate, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0935
+@SYMTestCaseDesc	    Tests for null field set on filter in the event view 
+                        Tests for CLogFilter::SetNullFields() function
+@SYMTestPriority 	    High
+@SYMTestActions  	    Clear the log events and add new events with fields set in.Define null fields in the filter and check the view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestEventViewForNullFieldsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0935 "));
+	CTestActive* active = new(ELeave)CTestActive;
+	CleanupStack::PushL(active);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+	event->SetEventType(KLogCallEventTypeUid);
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	// Wait a second
+	User::After(1000000);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	// Make sure there are no events
+	TEST(!view->SetFilterL(*filter, active->iStatus));
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetContact(KTestContact1);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDirection(KTestDirection1);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetNumber(KTestNumber1);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetRemoteParty(KTestRemote1);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetStatus(KTestStatus1);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetSubject(KTestSubject);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetLink(KTestLink);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDataL(KTestData);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Test for NULL fields
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 9);
+
+	filter->SetNullFields(ELogContactField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField | ELogNumberField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField | ELogNumberField | ELogRemotePartyField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField | ELogNumberField | ELogRemotePartyField | ELogStatusField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField | ELogNumberField | ELogRemotePartyField | ELogStatusField | ELogSubjectField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField | ELogNumberField | ELogRemotePartyField | ELogStatusField | ELogSubjectField | ELogLinkField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogContactField | ELogDirectionField | ELogNumberField | ELogRemotePartyField | ELogStatusField | ELogSubjectField | ELogLinkField | ELogDataField);
+
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	CleanupStack::PopAndDestroy(4); // filter, view, event, active
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0936
+@SYMTestCaseDesc	    Tests for null field set on filter for the recent event view list 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Clear the log events and add new events with fields set in.Define null fields in the filter and check the view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestRecentViewForNullFieldsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0936 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetNumber(_L("1"));
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetStatus(KTestStatus1);
+	event->SetNumber(_L("2"));
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetSubject(KTestSubject);
+	event->SetNumber(_L("3"));
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetLink(KTestLink);
+	event->SetNumber(_L("4"));
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDataL(KTestData);
+	event->SetNumber(_L("5"));
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 5);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Test for NULL fields
+
+	filter->SetNullFields(ELogStatusField);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogStatusField | ELogSubjectField);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogStatusField | ELogSubjectField | ELogLinkField);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	filter->SetNullFields(ELogStatusField | ELogSubjectField | ELogLinkField | ELogDataField);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view->CountL(), 1);
+
+	CleanupStack::PopAndDestroy(4); // filter, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0937
+@SYMTestCaseDesc	    Tests for null field set on filter for the duplicate event view list 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Clear the log events and add new events with fields set in.Define null fields in the filter and check the view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestDuplicateViewForNullFieldsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0937 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetContact(KTestContact1);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetStatus(KTestStatus1);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetSubject(KTestSubject);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetLink(KTestLink);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDataL(KTestData);
+
+	// Add event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetDurationType(KLogDurationNone);
+	event->SetStatus(KNullDesC);
+
+	// Add event - This will be the entry in recent list
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Should only be one event in recent list - the rest are duplicates
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	// Check duplicate count
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 5);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	filter->SetNullFields(ELogStatusField);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+
+	filter->SetNullFields(ELogStatusField | ELogSubjectField);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+
+	filter->SetNullFields(ELogStatusField | ELogSubjectField | ELogLinkField);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+
+	filter->SetNullFields(ELogStatusField | ELogSubjectField | ELogLinkField | ELogDataField);
+
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+
+	CleanupStack::PopAndDestroy(5); // filter, duplicate, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0938
+@SYMTestCaseDesc	    Querying event view for flags test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Clear the log events and add new events with fields set in.Define null fields and set flags in the filter and check the view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestEventViewForFlagsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0938 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	// Wait a second
+	User::After(1000000);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+	
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	// Make sure there are now events
+	TEST(!view->SetFilterL(*filter, active->iStatus));
+
+	// Add some events
+	event->SetEventType(KLogCallEventTypeUid);
+	TLogFlags flags = KLogFlagsMask + 1;
+	TLogFlags flags2;
+
+	while(flags--)
+		{
+		event->ClearFlags(0xF);
+		event->SetFlags(flags);
+
+		// Add event
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+
+	flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		filter->ClearFlags(0xF);
+		// we use this because, since the events were all created without contact ids
+		// the log engine looked each one up in the contacts DB and set the flag so we
+		// need to set it in the flags being looked for
+		flags2 = static_cast<TLogFlags>(flags | KLogEventContactSearched);
+		filter->SetFlags(flags2);
+		active->StartL();
+		TEST(view->SetFilterL(*filter, active->iStatus));
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		TEST((view->Event().Flags() & flags2) == flags2);
+
+		while(view->NextL(active->iStatus))
+			{
+			active->StartL();
+			CActiveScheduler::Start();
+			TEST2(active->iStatus.Int(), KErrNone);
+			TEST((view->Event().Flags() & flags2) == flags2);
+			}
+		}
+	
+	// Now TEST we can query for the inverse
+	filter->SetNullFields(ELogFlagsField);
+
+	flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		filter->ClearFlags(0xF);
+		// we use this because, since the events were all created without contact ids
+		// the log engine looked each one up in the contacts DB and set the flag so we
+		// need to unset it in the flags being excluded
+		flags2 = static_cast<TLogFlags>(flags & ~KLogEventContactSearched);
+		filter->SetFlags(flags2);
+
+		active->StartL();
+		TEST(view->SetFilterL(*filter, active->iStatus));
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		TEST((~view->Event().Flags() & flags2) == flags2);
+
+		while(view->NextL(active->iStatus))
+			{
+			active->StartL();
+			CActiveScheduler::Start();
+			TEST2(active->iStatus.Int(), KErrNone);
+			TEST((~view->Event().Flags() & flags2) == flags2);
+			}
+		}
+
+	CleanupStack::PopAndDestroy(4); // filter, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0939
+@SYMTestCaseDesc	    Querying recent event view for flags test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Change the log configuration.Clear the log for any recent list and add some events.Query for flags in the recent view list
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestRecentViewForFlagsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0939 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TLogConfig config;
+
+	// Change the log engine config
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	config.iMaxRecentLogSize = KLogFlagsMask + 1;
+
+	// Change the log engine config
+	active->StartL();
+	aClient.ChangeConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Make sure there are no events
+	TEST(!view->SetRecentListL(KLogNullRecentList, *filter, active->iStatus));
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	// Add some events
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+
+	TLogFlags flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		event->ClearFlags(0xF);
+		event->SetFlags(flags);
+		event->SetContact(flags);
+
+		// Add event
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+
+	flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		filter->ClearFlags(0xF);
+		filter->SetFlags(flags);
+
+		active->StartL();
+		TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		TEST((view->Event().Flags() & flags) == flags);
+
+		while(view->NextL(active->iStatus))
+			{
+			active->StartL();
+			CActiveScheduler::Start();
+			TEST2(active->iStatus.Int(), KErrNone);
+			TEST((view->Event().Flags() & flags) == flags);
+			}
+		}
+	
+	// Now TEST we can query for the inverse
+	filter->SetNullFields(ELogFlagsField);
+
+	flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		filter->ClearFlags(0xF);
+		filter->SetFlags(flags);
+
+		active->StartL();
+		TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		TEST((~view->Event().Flags() & flags) == flags);
+
+		while(view->NextL(active->iStatus))
+			{
+			active->StartL();
+			CActiveScheduler::Start();
+			TEST2(active->iStatus.Int(), KErrNone);
+			TEST((~view->Event().Flags() & flags) == flags);
+			}
+		}
+
+	CleanupStack::PopAndDestroy(4); // filter, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0940
+@SYMTestCaseDesc	    Querying duplicate event view for flags test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Change the log configuration.Clear the log for any recent list and add some events.Query for flags in the duplicate view list
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestDuplicateViewForFlagsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0940 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Make sure there are now events
+	TEST(!view->SetRecentListL(KLogNullRecentList, *filter, active->iStatus));
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	// Add some events
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetDurationType(KLogDurationNone);
+	event->SetContact(KTestContact1);
+	event->SetStatus(KTestStatus1);
+
+	TLogFlags flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		event->ClearFlags(0xF);
+		event->SetFlags(flags);
+
+		// Add event
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+
+	// Add an extra event which will be the most recent
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+
+	flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		filter->ClearFlags(0xF);
+		filter->SetFlags(flags);
+
+		active->StartL();
+		TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		TEST((duplicate->Event().Flags() & flags) == flags);
+
+		while(duplicate->NextL(active->iStatus))
+			{
+			active->StartL();
+			CActiveScheduler::Start();
+			TEST2(active->iStatus.Int(), KErrNone);
+			TEST((duplicate->Event().Flags() & flags) == flags);
+			}
+		}
+	
+	// Now TEST we can query for the inverse
+	filter->SetNullFields(ELogFlagsField);
+
+	flags = KLogFlagsMask + 1;
+	while(flags--)
+		{
+		filter->ClearFlags(0xF);
+		filter->SetFlags(flags);
+
+		active->StartL();
+		TEST(view->DuplicatesL(*duplicate, *filter, active->iStatus));
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		TEST((~duplicate->Event().Flags() & flags) == flags);
+
+		while(duplicate->NextL(active->iStatus))
+			{
+			active->StartL();
+			CActiveScheduler::Start();
+			TEST2(active->iStatus.Int(), KErrNone);
+			TEST((~duplicate->Event().Flags() & flags) == flags);
+			}
+		}
+
+	CleanupStack::PopAndDestroy(5); // filter, duplicate, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0941
+@SYMTestCaseDesc	    Tests for removing recent events.Tests for CLogClient::ClearLog() function 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Clear log for any recent entries.Add events and create the view.Test for removing the recent events from the view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestRemovingRecentEventsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0941 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Make sure there are no events
+	TEST(!view->SetRecentListL(KLogNullRecentList, active->iStatus));
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	// Add some events
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+
+	TInt count = 10;
+	while(count--)
+		{
+		// Add event
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+
+	// Create the view
+	active->StartL();
+	TEST(view->SetRecentListL(KLogNullRecentList, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	TLogId id = view->Event().Id();
+	while(view->NextL(active->iStatus))
+		{
+		active->StartL();
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+
+		// Try removing the previous event
+		view->RemoveL(id);
+		id = view->Event().Id();
+		}
+
+	// Try removing the current event
+	view->RemoveL(id);
+	TEST(!view->SetRecentListL(KLogNullRecentList, active->iStatus));
+
+	CleanupStack::PopAndDestroy(3); // view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0942
+@SYMTestCaseDesc	    Removing duplicate events from the duplicate view
+                        Tests for CLogViewRecent::DuplicatesL() function
+@SYMTestPriority 	    High
+@SYMTestActions  	    Clear log for any recent entries.Add events and create the view and duplicate view.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestRemovingDuplicateEventsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0942 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Make sure there are no events
+	TEST(!view->SetRecentListL(KLogNullRecentList, active->iStatus));
+
+	// Incoming
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+
+	// Add some events
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf);
+	event->SetDurationType(KLogDurationNone);
+	event->SetContact(KTestContact1);
+	event->SetStatus(KTestStatus1);
+
+	TInt count = 10;
+	while(count--)
+		{
+		// Add event
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		RDebug::Print(_L("EVENT ID: %d\n"), event->Id());
+		}
+
+	// Create the view
+	active->StartL();
+	TEST(view->SetRecentListL(KLogNullRecentList, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Create the duplicate view
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	count = duplicate->CountL();
+	TEST2(count, 9);
+
+	TLogId id = duplicate->Event().Id();
+	while(duplicate->NextL(active->iStatus))
+		{
+		active->StartL();
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+
+		// Try removing the previous event
+		duplicate->RemoveL(id);
+		id = duplicate->Event().Id();
+		}
+
+	// Try removing the current event
+	duplicate->RemoveL(id);
+	count = duplicate->CountL();
+	TEST2(count, 0);
+	//
+	TEST(!view->DuplicatesL(*duplicate, active->iStatus));
+
+	CleanupStack::PopAndDestroy(4); // duplicate, view, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0943
+s@SYMTestCaseDesc	    Multiple log event views test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Add events and set the filter with different fields.Check for log event views
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestMultipleViews1L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0943 "));
+	CTestActive* active1 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active1);
+
+	// Wait a second
+	User::After(1000000);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active1->StartL();
+	aClient.ClearLog(now, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	CTestActive* active2 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active2);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetContact(KTestContact1);
+	event->SetDirection(KTestDirection1);
+	event->SetDurationType(KLogDurationNone);
+	event->SetNumber(KTestNumber1);
+	event->SetRemoteParty(KTestRemote1);
+	event->SetStatus(KTestStatus1);
+
+	// Add event
+	active1->StartL();
+	aClient.AddEvent(*event, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	event->SetEventType(KLogDataEventTypeUid);
+	event->SetContact(KTestContact2);
+	event->SetDirection(KTestDirection2);
+	event->SetDurationType(KLogDurationValid);
+	event->SetNumber(KTestNumber2);
+	event->SetRemoteParty(KTestRemote2);
+	event->SetStatus(KTestStatus2);
+
+	// Add event
+	active1->StartL();
+	aClient.AddEvent(*event, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	event->SetEventType(KLogFaxEventTypeUid);
+	event->SetContact(KTestContact3);
+	event->SetDirection(KTestDirection3);
+	event->SetDurationType(KLogDurationData);
+	event->SetNumber(KTestNumber3);
+	event->SetRemoteParty(KTestRemote3);
+	event->SetStatus(KTestStatus3);
+
+	// Add event
+	active1->StartL();
+	aClient.AddEvent(*event, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	CLogFilterList* list = new(ELeave)CLogFilterList;
+	CleanupStack::PushL(list);
+
+	CLogViewEvent* view1 = CLogViewEvent::NewL(aClient);
+	CleanupStack::PushL(view1);
+
+	CLogViewEvent* view2 = CLogViewEvent::NewL(aClient);
+	CleanupStack::PushL(view2);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test Views
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+	filter->SetRemoteParty(KTestRemote2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+	filter->SetRemoteParty(KTestRemote3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+	filter->SetStatus(KTestStatus1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+	filter->SetRemoteParty(KTestRemote2);
+	filter->SetStatus(KTestStatus2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+	filter->SetRemoteParty(KTestRemote3);
+	filter->SetStatus(KTestStatus3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	CleanupStack::PopAndDestroy(6); // list, view1, view2, event, active1, active2
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0944
+@SYMTestCaseDesc	    Multiple log event views test
+@SYMTestPriority 	    High
+@SYMTestActions  	    Add events and set the filter with different fields.
+						Check for log event views and the test for the count of events
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestMultipleViews2L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0944 "));
+	CTestActive* active1 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active1);
+
+	// Wait a second
+	User::After(1000000);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active1->StartL();
+	aClient.ClearLog(now, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	CTestActive* active2 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active2);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetContact(KTestContact1);
+	event->SetDirection(KTestDirection1);
+	event->SetDurationType(KLogDurationNone);
+	event->SetNumber(KTestNumber1);
+	event->SetRemoteParty(KTestRemote1);
+	event->SetStatus(KTestStatus1);
+
+	// Add event
+	active1->StartL();
+	aClient.AddEvent(*event, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	event->SetEventType(KLogDataEventTypeUid);
+	event->SetContact(KTestContact2);
+	event->SetDirection(KTestDirection2);
+	event->SetDurationType(KLogDurationValid);
+	event->SetNumber(KTestNumber2);
+	event->SetRemoteParty(KTestRemote2);
+	event->SetStatus(KTestStatus2);
+
+	// Add event
+	active1->StartL();
+	aClient.AddEvent(*event, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	event->SetEventType(KLogFaxEventTypeUid);
+	event->SetContact(KTestContact3);
+	event->SetDirection(KTestDirection3);
+	event->SetDurationType(KLogDurationData);
+	event->SetNumber(KTestNumber3);
+	event->SetRemoteParty(KTestRemote3);
+	event->SetStatus(KTestStatus3);
+
+	// Add event
+	active1->StartL();
+	aClient.AddEvent(*event, active1->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrNone);
+
+	CLogFilterList* list = new(ELeave)CLogFilterList;
+	CleanupStack::PushL(list);
+
+	CLogViewEvent* view1 = CLogViewEvent::NewL(aClient);
+	CleanupStack::PushL(view1);
+
+	CLogClient* client2 = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client2);
+
+	CLogViewEvent* view2 = CLogViewEvent::NewL(*client2);
+	CleanupStack::PushL(view2);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test Views
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+	filter->SetRemoteParty(KTestRemote2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+	filter->SetRemoteParty(KTestRemote3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	/////////////////////////////////////////
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact1);
+	filter->SetDirection(KTestDirection1);
+	filter->SetDurationType(KLogDurationNone);
+	filter->SetEventType(KLogCallEventTypeUid);
+	filter->SetNumber(KTestNumber1);
+	filter->SetRemoteParty(KTestRemote1);
+	filter->SetStatus(KTestStatus1);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 1);
+	TEST2(view2->CountL(), 1);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact2);
+	filter->SetDirection(KTestDirection2);
+	filter->SetDurationType(KLogDurationValid);
+	filter->SetEventType(KLogDataEventTypeUid);
+	filter->SetNumber(KTestNumber2);
+	filter->SetRemoteParty(KTestRemote2);
+	filter->SetStatus(KTestStatus2);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 2);
+	TEST2(view2->CountL(), 2);
+
+	filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// Set filter
+	filter->SetContact(KTestContact3);
+	filter->SetDirection(KTestDirection3);
+	filter->SetDurationType(KLogDurationData);
+	filter->SetEventType(KLogFaxEventTypeUid);
+	filter->SetNumber(KTestNumber3);
+	filter->SetRemoteParty(KTestRemote3);
+	filter->SetStatus(KTestStatus3);
+
+	list->AppendL(filter);
+	CleanupStack::Pop(); // filter
+
+	// Test View
+	active1->StartL();
+	active2->StartL();
+	TEST(view1->SetFilterL(*list, active1->iStatus));
+	TEST(view2->SetFilterL(*list, active2->iStatus));
+	CActiveScheduler::Start();
+	CActiveScheduler::Start();
+	TEST2(view1->CountL(), 3);
+	TEST2(view2->CountL(), 3);
+
+	list->ResetAndDestroy();
+
+	CleanupStack::PopAndDestroy(7); // list, view1, view2, client2, event, active1, active2
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0945
+@SYMTestCaseDesc	    Tests for notification on changes done to the view
+                        Tests for CLogViewChangeObserver::iStatus 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for setting a filter on the view.Check for receiving notifications on adding events to the view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestViewChangeEventsL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0945 "));
+	TestUtils::DeleteDatabaseL();
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+	event->SetEventType(KLogCallEventTypeUid);
+
+	CTestActive* active = new(ELeave) CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewChangeObserver* changeObs = CLogViewChangeObserver::NewLC();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	TEST(!view->SetFilterL(*filter, active->iStatus));
+
+	// Add some events and check we receive change notifications
+	TInt count;
+	TLogId logId;
+	TInt viewIndex;
+	//
+	for(count = 0; count < KTestEventNum; count++)
+		{
+		aClient.AddEvent(*event, changeObs->iStatus);
+		CLogChangeDefinition* changes = changeObs->WaitForChangesLC(CLogViewChangeObserver::EStopOnBoth);
+		TEST2(changeObs->iStatus.Int(), KErrNone);
+		TEST(event->Id() == (TLogId) count);
+		//
+		User::After(1);
+		//
+		TEST2(changes->Count(), 1);
+		TEST2(changes->At(0, logId, viewIndex), ELogChangeTypeEventAdded);
+		TEST(logId == (TLogId) count);
+		TEST2(viewIndex, 0);
+		CleanupStack::PopAndDestroy(changes);
+		}
+
+	CleanupStack::PopAndDestroy(5, event); // filter, view, changeObs, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0946
+@SYMTestCaseDesc	    Tests for events in the recent view list 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for events in the recent view list after setting the filters for incoming,outgoing and missed calls
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestAltEventsInRecentListL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0946 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	// Clear recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	TLogString buf;
+	event->SetEventType(KLogCallEventTypeUid);
+	
+	// Add Incoming events
+	aClient.GetString(buf, R_LOG_DIR_IN);	
+	event->SetDirection(buf);
+	event->SetContact(1);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);	
+	aClient.GetString(buf, R_LOG_DIR_IN_ALT);
+	event->SetDirection(buf);
+	event->SetContact(2);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	// Verify both events in recent list
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);  
+	TEST2(view->CountL(), 2);
+
+	// Add Outgoing events
+	aClient.GetString(buf, R_LOG_DIR_OUT);
+	event->SetDirection(buf);
+	event->SetContact(3);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	aClient.GetString(buf, R_LOG_DIR_OUT_ALT);
+	event->SetDirection(buf);
+	event->SetContact(4);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	// Verify both events in recent list
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	// Add Missed events
+	aClient.GetString(buf, R_LOG_DIR_MISSED);
+	event->SetDirection(buf);
+	event->SetContact(5);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	aClient.GetString(buf, R_LOG_DIR_MISSED_ALT);
+	event->SetDirection(buf);
+	event->SetContact(6);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	// Verify both events in recent list
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	CleanupStack::PopAndDestroy(3); // view, active, event, 
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0947
+@SYMTestCaseDesc	    Tests for view with filter by time 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for view with filters set by different time
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestFilterByTimeL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0947 "));
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	// Clear recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	TLogString buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);	
+	event->SetDirection(buf);
+	
+	// add first event (events following are added on successive days)
+	event->SetContact(1);  // ensures events are not duplicates
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);		
+
+	TTime systemTime;
+	systemTime.UniversalTime();
+
+	// set filter startDate
+	TTime startDate = systemTime + (TTimeIntervalHours)+1;
+
+	// add event 2	
+	systemTime += (TTimeIntervalDays)+1;
+	event->SetContact(2);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);	
+
+	event->SetTime(systemTime);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	// add event 3
+	systemTime += (TTimeIntervalDays)+1;
+	event->SetContact(3);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetTime(systemTime);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// set filter endDate 
+	TTime endDate = systemTime + (TTimeIntervalHours)+1;
+
+	// add event 4
+	systemTime += (TTimeIntervalDays)+1;
+	event->SetContact(4);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->SetTime(systemTime);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	
+	// check using both start and end
+	filter->SetStartTime(startDate);	
+	filter->SetEndTime(endDate);		
+	active->StartL();
+	TEST(view->SetRecentListL(KLogNullRecentList, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);  
+	TEST2(view->CountL(), 2); 
+
+	//  only end filter
+	filter->SetStartTime(TTime(0));	// reset	
+	filter->SetEndTime(endDate);		
+	active->StartL();
+	TEST(view->SetRecentListL(KLogNullRecentList, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);  
+	TEST2(view->CountL(), 3); 
+
+	//  only start filter
+	filter->SetStartTime(startDate); 
+	filter->SetEndTime(TTime(0));		
+	active->StartL();
+	TEST(view->SetRecentListL(KLogNullRecentList, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);  
+	TEST2(view->CountL(), 3); 	
+
+	//  no time filter
+	filter->SetStartTime(TTime(0)); 
+	filter->SetEndTime(TTime(0));		
+	active->StartL();
+	TEST(view->SetRecentListL(KLogNullRecentList, *filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);  
+	TEST2(view->CountL(), 4); 	
+
+	CleanupStack::PopAndDestroy(4); // view, active, event, filter 
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0948
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events for duplicates
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents1L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0948 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+
+	// Add a new event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check change events
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(100000);
+	CActiveScheduler::Start();
+	delete timer;
+	
+	TEST2(changeObs2->Changes().Count(), 2);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventAdded);
+	type = changeObs2->Changes().At(1, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventDeleted);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	active->StartL();
+	TEST(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+
+	// Check change events
+	User::After(100000);
+	TEST2(changeObs1->Changes().Count(), 1);
+	type = changeObs1->Changes().At(0, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventAdded);
+
+	CleanupStack::PopAndDestroy(8); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0949
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when recent list purged
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents2L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0949 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Get config
+	TLogConfig config;
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add max allowed events
+	TInt count = config.iMaxRecentLogSize;
+	while(count--)
+		{
+		event->SetContact(count+1);
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+
+	// Setup normal event view
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), config.iMaxRecentLogSize);
+
+	// Add a new event, will cause one to be purged from recent view
+	event->SetContact(1234);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check change events
+	CTestTimer *timer = CTestTimer::NewL();
+ 	timer->After(100000);
+ 	CActiveScheduler::Start();
+ 	delete timer;
+		
+	TEST2(changeObs2->Changes().Count(), 2);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventAdded);
+	type = changeObs2->Changes().At(1, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventDeleted);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), config.iMaxRecentLogSize);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	TEST(!recent->DuplicatesL(*duplicate, active->iStatus));
+
+	// Check change events
+	User::After(100000);
+	TEST2(changeObs1->Changes().Count(), 1);
+	type = changeObs1->Changes().At(0, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventAdded);
+
+	CleanupStack::PopAndDestroy(8); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0950
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when recent list purged after changing config
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents3L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0950 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Get and set config
+	TLogConfig config;
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	config.iMaxRecentLogSize = 2;
+	active->StartL();
+	aClient.ChangeConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add max allowed events
+	TInt count = config.iMaxRecentLogSize;
+	while(count--)
+		{
+		event->SetContact(count+1);
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+
+	// Setup normal event view
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), config.iMaxRecentLogSize);
+
+	// Change config, will cause one event to be purged from recent view
+	config.iMaxRecentLogSize = 1;
+	active->StartL();
+	aClient.ChangeConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check change events
+	User::After(100000);
+	TEST2(changeObs2->Changes().Count(), 1);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventDeleted);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), config.iMaxRecentLogSize);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	TEST(!recent->DuplicatesL(*duplicate, active->iStatus));
+
+	// Check change events
+	User::After(100000);
+	TEST(!changeObs1->HaveChanges());
+
+	CleanupStack::PopAndDestroy(8); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0951
+@SYMTestCaseDesc	    Test for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that when deleting an event causing recent lists to be updated,views don't get unnecessary change events
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents4L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0951 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	filter->SetFlags(1); // Need to hide an event from the view
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	event->SetFlags(1);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	event->ClearFlags(0xF);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+
+	changeObs1->StartCollectingChanges();
+	changeObs2->StartCollectingChanges();
+
+	// Delete the event in recent list
+	active->StartL();
+	aClient.DeleteEvent(event->Id(), active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check change events
+	User::After(1000000);
+	TEST2(changeObs2->Changes().Count(), 2);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventAdded);
+	type = changeObs2->Changes().At(1, logId, viewIndex);
+	TEST2(type, ELogChangeTypeEventDeleted);
+
+	TEST(!changeObs1->HaveChanges());
+
+	CleanupStack::PopAndDestroy(7); // changeObs1, changeObs2, view, filter, event, active, recent
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0952
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when recent list cleared
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents5L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0952 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Get config
+	TLogConfig config;
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add max allowed events
+	TInt count = config.iMaxRecentLogSize;
+	while(count--)
+		{
+		event->SetContact(count+1);
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+
+	// Setup normal event view
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), config.iMaxRecentLogSize);
+
+	// Clear recent view
+	active->StartL();
+	aClient.ClearLog(KLogRecentIncomingCalls, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check change events
+	User::After(100000);
+
+	count = config.iMaxRecentLogSize;
+	TEST2(changeObs2->Changes().Count(), count);
+	while(count--)
+		{
+		type = changeObs2->Changes().At(count, logId, viewIndex);
+		TEST2(type, ELogChangeTypeEventDeleted);
+		}
+
+	// Check recent view
+	TEST(!recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+
+	// Check change events
+	User::After(100000);
+	TEST(!changeObs1->HaveChanges());
+
+	CleanupStack::PopAndDestroy(7); // changeObs1, changeObs2, view, filter, event, active, recent
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0953
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when removing events from a recent or duplicate view
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents6L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0953 "));
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Add a duplicate
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	active->StartL();
+	TEST(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+
+	// Remove duplicate
+	duplicate->RemoveL(duplicate->Event().Id());
+
+	CTestTimer* timer = CTestTimer::NewL();
+	CleanupStack::PushL(timer);
+	timer->After(100000);
+	CActiveScheduler::Start();
+
+	// Check change events
+	TEST(!changeObs1->HaveChanges());
+	TEST(!changeObs2->HaveChanges());
+
+	// Remove recent
+	recent->RemoveL(recent->Event().Id());
+
+	// Check change events
+	timer->After(100000);
+	CActiveScheduler::Start();
+
+	TEST(!changeObs1->HaveChanges());
+	TEST(!changeObs2->HaveChanges()); // No event because we should know we called Remove on ourselves
+
+	CleanupStack::PopAndDestroy(9); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate, timer
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0954
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when clearing duplicates
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents7L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0954 "));
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Add a duplicate
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	TEST(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	active->StartL();
+	TEST(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+
+	// Remove duplicate
+	recent->ClearDuplicatesL();
+
+	CTestTimer* timer = CTestTimer::NewL();
+	CleanupStack::PushL(timer);
+	timer->After(100000);
+	CActiveScheduler::Start();
+
+	// Check change events
+	TEST(!changeObs1->HaveChanges());
+	TEST(!changeObs2->HaveChanges());
+
+	CleanupStack::PopAndDestroy(9); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate, timer
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-1363
+@SYMTestCaseDesc	    Tests for log view change observer 
+						Making a call from recent call list causes total freeze if log 
+						has been cleared
+@SYMTestPriority 	    High
+@SYMTestActions  	    Test that editing a recent event does not cause a panic if 
+						part of the log has been cleared
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF066296
+*/
+LOCAL_C void DEF066296L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-1363 "));
+	TBuf<KLogMaxDirectionLength> buf;
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	// To reproduce this defect, we need a view to be updated
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	// Set up the event and log a call from number 444
+	event->SetEventType(KLogCallEventTypeUid);
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+	event->SetNumber(_L("444"));
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	// Set up the view to display the recent call list
+	active->StartL();
+	test(view->SetRecentListL(-1, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Get and print current UTC time
+	TTime now;
+	now.UniversalTime();
+	TBuf<0x80> testString;
+	now.FormatL(testString,(_L("%H:%T %1\\%2\\%3 %E")));
+	RDebug::Print(_L("Current  UTC  time    - %S\n"), &testString);
+
+	// Move the UTC time forward by one day
+	now += TTimeIntervalDays(1);
+	User::SetUTCTime(now);
+
+	now.FormatL(testString,(_L("%H:%T %1\\%2\\%3 %E")));
+	RDebug::Print(_L("Changed  UTC  time to - %S\n"), &testString);
+	
+	// Set up the event and log a call from number 555
+	event->SetNumber(_L("555"));
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	// Set up the event and log a call from number 611
+	event->SetNumber(_L("611"));
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	//remember this Id - we will try to change this log event later
+	TInt logId = event->Id();
+
+	// Set up the event and log a call from number 777
+	event->SetNumber(_L("777"));
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Delete all events occurring before today
+	// this should remove only the first call to number 444
+	TDateTime midnight = now.DateTime();
+	midnight.SetHour(0);
+	midnight.SetMinute(0);
+	midnight.SetSecond(0);
+	midnight.SetMicroSecond(0);
+
+	active->StartL();
+	aClient.ClearLog(midnight, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Attempt to change an entry from the recent list - that for the call to number 611 
+	// without this defect fix, the call to ChangeEvent() will panic with EBadArrayPosition
+	event->SetNumber(_L("555"));
+	event->SetId(logId);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Restore and print UTC time
+	now.UniversalTime();
+	now -= TTimeIntervalDays(1);
+	User::SetUTCTime(now);
+
+	now.FormatL(testString,(_L("%H:%T %1\\%2\\%3 %E")));
+	RDebug::Print(_L("Restored UTC  time to - %S\n"), &testString);
+
+	CleanupStack::PopAndDestroy(3, event); //event, active, view
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-1807
+@SYMTestCaseDesc	    Tests that DEF087459 works between 00:00 and 01:00am hometime
+@SYMTestPriority 	    Medium
+@SYMTestActions  	    Change the home time to 00:30 and run DEF066296 test
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF087459
+*/
+LOCAL_C void DEF087459L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-1807 "));
+	RTz tz;				
+	TInt err = tz.Connect();
+	TEST2(err, KErrNone);
+	CleanupClosePushL(tz);
+	TTime now, saveNow;
+	
+	// Get and print current home time and save it
+	now.HomeTime();
+	saveNow=now;
+	
+	TBuf<0x80> testString;
+	now.FormatL(testString,(_L("%H:%T %1\\%2\\%3 %E")));
+	RDebug::Print(_L("Current  home time    - %S\n"), &testString);
+
+	// Problem occurred between midnight and 01:00am hometime, so change home time to
+	// be 00:30am
+	TDateTime midnight = now.DateTime();
+	midnight.SetHour(0);
+	midnight.SetMinute(30);
+	midnight.SetSecond(0);
+	midnight.SetMicroSecond(0);
+	
+	TTime newTime=midnight;
+
+	err = tz.SetHomeTime(midnight);
+	TEST2(err, KErrNone);
+
+	// Get and print new home time
+	now.HomeTime();
+	now.FormatL(testString,(_L("%H:%T %1\\%2\\%3 %E")));
+	RDebug::Print(_L("Changed  home time to - %S\n"), &testString);
+	RDebug::Print(_L("Re-running DEF066296 test\n"));
+	
+	DEF066296L(aClient);
+	
+	// Restore and print hometime
+	err = tz.SetHomeTime(saveNow);
+	TEST2(err, KErrNone);
+	now.HomeTime();
+	now.FormatL(testString,(_L("%H:%T %1\\%2\\%3 %E")));
+	RDebug::Print(_L("Restored home time to - %S\n"), &testString);
+	
+	CleanupStack::PopAndDestroy(); //tz
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0955
+@SYMTestCaseDesc	    Tests that events can be changed to move them between recent lists
+@SYMTestPriority 	    High
+@SYMTestActions  	    Add the events to the view.Move most recent event to another recent list
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestChangeEventRecentView1L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0955 "));
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CLogViewRecent* recent1 = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(recent1);
+
+	CLogViewDuplicate* duplicate1 = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate1);
+
+	CLogViewRecent* recent2 = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(recent2);
+
+	CLogViewDuplicate* duplicate2 = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate2);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	TBuf<KLogMaxDirectionLength> incoming;
+	aClient.GetString(incoming, R_LOG_DIR_IN);
+
+	// Missed call event
+	TBuf<KLogMaxDirectionLength> missed;
+	aClient.GetString(missed, R_LOG_DIR_MISSED);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(missed);
+	event->SetContact(1);
+
+	// Add some events
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id1 = event->Id();
+
+	User::After(1000000);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id2 = event->Id();
+
+	User::After(1000000);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id3 = event->Id();
+
+	User::After(1000000);
+
+	// Most recent
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id4 = event->Id();
+
+	// Check there's a recent event in the list
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id4);
+
+	// Check it has duplicates
+	active->StartL();
+	TEST(recent1->DuplicatesL(*duplicate1, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->CountL(), 3);
+	TEST2(duplicate1->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate1->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->Event().Id(), id2);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate1->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->Event().Id(), id1);
+
+	// Other recent list should be empty
+	TEST(!recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+
+	// Now move most recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Most recent duplicate should now be the latest
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id3);
+	event->CopyL(recent1->Event()); // for later
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent1->DuplicatesL(*duplicate1, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->CountL(), 2);
+	TEST2(duplicate1->Event().Id(), id2);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate1->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->Event().Id(), id1);
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id4);
+
+	// No duplicates yet
+	TEST(!recent2->DuplicatesL(*duplicate2, active->iStatus));
+
+	// Now move most recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Most recent duplicate should now be the latest
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id2);
+	event->CopyL(recent1->Event()); // for later
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent1->DuplicatesL(*duplicate1, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->CountL(), 1);
+	TEST2(duplicate1->Event().Id(), id1);
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id4);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent2->DuplicatesL(*duplicate2, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->CountL(), 1);
+	TEST2(duplicate2->Event().Id(), id3);
+
+	// Now move most recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Most recent duplicate should now be the latest
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id1);
+	event->CopyL(recent1->Event()); // for later
+
+	// Should be no more duplicates
+	TEST(!recent1->DuplicatesL(*duplicate1, active->iStatus));
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id4);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent2->DuplicatesL(*duplicate2, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->CountL(), 2);
+	TEST2(duplicate2->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->Event().Id(), id2);
+
+	// Now move most recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// No more recent events
+	TEST(!recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id4);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent2->DuplicatesL(*duplicate2, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->CountL(), 3);
+	TEST2(duplicate2->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->Event().Id(), id2);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->Event().Id(), id1);
+
+	CleanupStack::PopAndDestroy(6); // active, event, recent1, duplicate1, recent2, duplicate2
+	}
+
+/**
+Test that events can be changed to move them between recent lists
+The same as TestChangeEventRecentView1L, but the events are transferred in reverse order
+
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0956
+@SYMTestCaseDesc	    Tests that events can be changed to move them between recent lists
+@SYMTestPriority 	    High
+@SYMTestActions  	    Add the events to the view.Move most recent event to another recent list in reverse order
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestChangeEventRecentView2L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0956 "));
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CLogViewRecent* recent1 = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(recent1);
+
+	CLogViewDuplicate* duplicate1 = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate1);
+
+	CLogViewRecent* recent2 = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(recent2);
+
+	CLogViewDuplicate* duplicate2 = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate2);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	TBuf<KLogMaxDirectionLength> incoming;
+	aClient.GetString(incoming, R_LOG_DIR_IN);
+
+	// Missed call event
+	TBuf<KLogMaxDirectionLength> missed;
+	aClient.GetString(missed, R_LOG_DIR_MISSED);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(missed);
+	event->SetContact(1);
+
+	// Add some events
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id1 = event->Id();
+
+	User::After(1000000);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id2 = event->Id();
+
+	User::After(1000000);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id3 = event->Id();
+
+	User::After(1000000);
+
+	// Most recent
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id4 = event->Id();
+
+	// Check there's a recent event in the list
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id4);
+
+	// Check it has duplicates
+	active->StartL();
+	TEST(recent1->DuplicatesL(*duplicate1, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->CountL(), 3);
+	TEST2(duplicate1->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate1->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->Event().Id(), id2);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate1->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->Event().Id(), id1);
+	event->CopyL(duplicate1->Event()); // for later
+
+	// Other recent list should be empty
+	TEST(!recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+
+	// Now move latest recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Most recent duplicate should still be the latest
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id4);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent1->DuplicatesL(*duplicate1, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->CountL(), 2);
+	TEST2(duplicate1->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate1->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->Event().Id(), id2);
+	event->CopyL(duplicate1->Event()); // for later
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id1);
+
+	// No duplicates yet
+	TEST(!recent2->DuplicatesL(*duplicate2, active->iStatus));
+
+	// Now move most recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Most recent duplicate should still be the latest
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id4);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent1->DuplicatesL(*duplicate1, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate1->CountL(), 1);
+	TEST2(duplicate1->Event().Id(), id3);
+	event->CopyL(duplicate1->Event()); // for later
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id2);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent2->DuplicatesL(*duplicate2, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->CountL(), 1);
+	TEST2(duplicate2->Event().Id(), id1);
+
+	// Now move most recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Most recent duplicate should still be the latest
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+	TEST2(recent1->Event().Id(), id4);
+	event->CopyL(recent1->Event()); // for later
+
+	// Should be no more duplicates
+	TEST(!recent1->DuplicatesL(*duplicate1, active->iStatus));
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id3);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent2->DuplicatesL(*duplicate2, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->CountL(), 2);
+	TEST2(duplicate2->Event().Id(), id2);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->Event().Id(), id1);
+
+	// Now move most recent event to another recent list
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// No more recent events
+	TEST(!recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+
+	// Now the event should have moved to another recent list
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 1);
+	TEST2(recent2->Event().Id(), id4);
+
+	// There should still be some duplicates
+	active->StartL();
+	TEST(recent2->DuplicatesL(*duplicate2, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->CountL(), 3);
+	TEST2(duplicate2->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->Event().Id(), id2);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate2->Event().Id(), id1);
+
+	CleanupStack::PopAndDestroy(6); // active, event, recent1, duplicate1, recent2, duplicate2
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0957
+@SYMTestCaseDesc	    Tests that change in log view after moving an event
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check recent views are purged if necessary after moving an event
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestChangeEventRecentViewAndPurgeL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0957 "));
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CLogViewRecent* recent1 = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(recent1);
+
+	CLogViewRecent* recent2 = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(recent2);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogNullRecentList, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Get log config
+	TLogConfig config;
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Set the max recent list size to something small
+	config.iMaxRecentLogSize = 3;
+	active->StartL();
+	aClient.ChangeConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming call event
+	TBuf<KLogMaxDirectionLength> incoming;
+	aClient.GetString(incoming, R_LOG_DIR_IN);
+
+	// Missed call event
+	TBuf<KLogMaxDirectionLength> missed;
+	aClient.GetString(missed, R_LOG_DIR_MISSED);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(missed);
+
+	// Add an event
+	event->SetContact(1);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id1 = event->Id();
+
+	User::After(1000000);
+	event->SetDirection(incoming);
+
+	// Add an event
+	event->SetContact(2);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id2 = event->Id();
+
+	User::After(1000000);
+
+	// Add an event
+	event->SetContact(3);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id3 = event->Id();
+
+	User::After(1000000);
+
+	// Add an event
+	event->SetContact(4);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id4 = event->Id();
+
+	// Check the views
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 3);
+
+	// Retrieve event
+	event->SetId(id1);
+	active->StartL();
+	aClient.GetEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Now move the oldest event to another recent list - it should be purged
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Missed call list now empty
+	TEST(!recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+
+	// Incoming view should be unchanged
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 3);
+	TEST2(recent2->Event().Id(), id4);
+
+	// Check id
+	active->StartL();
+	TEST(recent2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(recent2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->Event().Id(), id2);
+
+	TTime now;
+	now.UniversalTime();
+
+	// This should have no effect
+	event->SetTime(now);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Incoming view should be unchanged
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 3);
+	TEST2(recent2->Event().Id(), id4);
+
+	// Check id
+	active->StartL();
+	TEST(recent2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(recent2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->Event().Id(), id2);
+
+	// Now add a new event to missed view (the latest)
+	User::After(1000000);
+	event->SetDirection(missed);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	User::After(1000000);
+	now.UniversalTime();
+
+	// This should have no effect
+	event->SetTime(now);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check the views
+	active->StartL();
+	TEST(recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent1->CountL(), 1);
+
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 3);
+
+	// Now move the latest event to another recent list - oldest should be purged
+	event->SetDirection(incoming);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	TEST(!recent1->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+
+	active->StartL();
+	TEST(recent2->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->CountL(), 3);
+	TEST2(recent2->Event().Id(), event->Id());
+
+	// Check id
+	active->StartL();
+	TEST(recent2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->Event().Id(), id4);
+
+	// Check id
+	active->StartL();
+	TEST(recent2->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent2->Event().Id(), id3);
+
+	CleanupStack::PopAndDestroy(4); // active, event, recent1, recent2
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0958
+@SYMTestCaseDesc	    Tests for the log view,on changing an event
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check an event can be removed from recent lists by changing it
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestChangeEventRecentViewRemoveL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0958 "));
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(recent);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Missed call event
+	TBuf<KLogMaxDirectionLength> missed;
+	aClient.GetString(missed, R_LOG_DIR_MISSED);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(missed);
+
+	// Add an event
+	event->SetContact(1);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id1 = event->Id();
+
+	User::After(1000000);
+
+	// Add some duplicates
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id2 = event->Id();
+
+	User::After(1000000);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id3 = event->Id();
+
+	User::After(1000000);
+
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TLogId id4 = event->Id();
+
+	// Check views
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+	TEST2(recent->Event().Id(), id4);
+
+	active->StartL();
+	TEST(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 3);
+	TEST2(duplicate->Event().Id(), id3);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->Event().Id(), id2);
+
+	// Check id
+	active->StartL();
+	TEST(duplicate->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->Event().Id(), id1);
+
+	// Fetched call event
+	TBuf<KLogMaxDirectionLength> fetched;
+	aClient.GetString(missed, R_LOG_DIR_FETCHED);
+
+	// Now change the event to remove it from recent lists
+	event->SetDirection(fetched);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check views
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+	TEST2(recent->Event().Id(), id3);
+
+	active->StartL();
+	TEST(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 2);
+	TEST2(duplicate->Event().Id(), id2);
+	event->CopyL(duplicate->Event()); // For later
+
+	// Check id
+	active->StartL();
+	TEST(duplicate->NextL(active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->Event().Id(), id1);
+
+	// Now change the event to remove it from recent lists
+	event->SetDirection(fetched);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check views
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+	TEST2(recent->Event().Id(), id3);
+
+	active->StartL();
+	TEST(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(duplicate->CountL(), 1);
+	TEST2(duplicate->Event().Id(), id1);
+	event->CopyL(duplicate->Event()); // For later
+
+	// Now change the event to remove it from recent lists
+	event->SetDirection(fetched);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	// Check views
+	active->StartL();
+	TEST(recent->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(recent->CountL(), 1);
+	TEST2(recent->Event().Id(), id3);
+	event->CopyL(recent->Event()); // For later
+
+	// No more duplicates
+	TEST(!recent->DuplicatesL(*duplicate, active->iStatus));
+
+	// Now change the event to remove it from recent lists
+	event->SetDirection(fetched);
+	active->StartL();
+	aClient.ChangeEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	TEST(!recent->SetRecentListL(KLogRecentMissedCalls, active->iStatus));
+
+	CleanupStack::PopAndDestroy(4); // active, event, recent, duplicate
+	}
+
+CBaBackupSessionWrapper* theBackup = NULL;
+
+LOCAL_C TBool IsLogOpenL()
+	{
+	return TestUtils::IsDatabaseOpenL();
+	}
+
+LOCAL_C void TestLogOpenL()
+	{
+	test(IsLogOpenL());
+	}
+
+LOCAL_C void TestLogClosedL()
+	{
+	test(!IsLogOpenL());
+	}
+
+LOCAL_C void StartBackupL()
+	{
+	User::InfoPrint(_L("Backup"));
+
+	TDriveUnit driveUnit(EDriveC);
+	TDriveName name = driveUnit.Name();
+
+	TParse parse;
+	LEAVE_IF_ERROR(parse.Set(KLogDatabaseName, &name, NULL));
+
+	delete theBackup;
+	theBackup = NULL;
+	theBackup = CBaBackupSessionWrapper::NewL();
+
+	theBackup->CloseFileL(parse.FullName(), MBackupObserver::EReleaseLockNoAccess);
+	User::After(1000000);
+	}
+
+LOCAL_C void EndBackupL()
+	{
+	delete theBackup;
+	theBackup = NULL;
+	User::After(1000000);
+	}
+
+LOCAL_C void DelayL(TInt aDelay)
+	{
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(aDelay);
+	CActiveScheduler::Start();
+	delete timer;
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0959
+@SYMTestCaseDesc	    Tests for log view change observer
+						Test change stuff with backup
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when clearing duplicates even after backup
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents1aL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0959 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	test(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == 1);
+
+	// Add a new event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	DelayL(1000000);
+	TestLogOpenL();
+	
+	test(changeObs2->Changes().Count() == 2);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	test(type == ELogChangeTypeEventAdded);
+	type = changeObs2->Changes().At(1, logId, viewIndex);
+	test(type == ELogChangeTypeEventDeleted);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == 1);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	active->StartL();
+	test(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+	test(duplicate->CountL() == 1);
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	// Check change events
+	User::After(100000);
+	test(changeObs1->Changes().Count() == 1);
+	type = changeObs1->Changes().At(0, logId, viewIndex);
+	test(type == ELogChangeTypeEventAdded);
+
+	CleanupStack::PopAndDestroy(8, changeObs1); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+
+/**
+Check that a view doesn't get change events when recent list purged
+
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0960
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when recent list purged,even after backup
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents2aL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0960 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+
+	// Get config
+	TLogConfig config;
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add max allowed events
+	TInt count = config.iMaxRecentLogSize;
+	while(count--)
+		{
+		event->SetContact(count+1);
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		test(active->iStatus == KErrNone);
+		}
+
+	// Setup normal event view
+	active->StartL();
+	test(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == config.iMaxRecentLogSize);
+
+	// Add a new event, will cause one to be purged from recent view
+	event->SetContact(1234);
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+	DelayL(1000000);
+		
+	test(changeObs2->Changes().Count() == 2);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	test(type == ELogChangeTypeEventAdded);
+	type = changeObs2->Changes().At(1, logId, viewIndex);
+	test(type == ELogChangeTypeEventDeleted);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == config.iMaxRecentLogSize);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	test(!recent->DuplicatesL(*duplicate, active->iStatus));
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	// Check change events
+	User::After(100000);
+	test(changeObs1->Changes().Count() == 1);
+	type = changeObs1->Changes().At(0, logId, viewIndex);
+	test(type == ELogChangeTypeEventAdded);
+
+	CleanupStack::PopAndDestroy(8, changeObs1); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+
+/**
+Check that a view doesn't get change events when recent list purged after changing config
+
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0961
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when recent list purged after changing config,even after backup
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents3aL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0961 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+
+	// Get and set config
+	TLogConfig config;
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	config.iMaxRecentLogSize = 2;
+	active->StartL();
+	aClient.ChangeConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add max allowed events
+	TInt count = config.iMaxRecentLogSize;
+	while(count--)
+		{
+		event->SetContact(count+1);
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		test(active->iStatus == KErrNone);
+		}
+
+	// Setup normal event view
+	active->StartL();
+	test(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == config.iMaxRecentLogSize);
+
+	// Change config, will cause one event to be purged from recent view
+	config.iMaxRecentLogSize = 1;
+	active->StartL();
+	aClient.ChangeConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+	DelayL(1000000);
+
+	// Check change events
+	User::After(100000);
+	test(changeObs2->Changes().Count() == 1);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	test(type == ELogChangeTypeEventDeleted);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == config.iMaxRecentLogSize);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	test(!recent->DuplicatesL(*duplicate, active->iStatus));
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	// Check change events
+	User::After(100000);
+	test(!changeObs1->HaveChanges());
+
+	CleanupStack::PopAndDestroy(8, changeObs1); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+
+/**
+Check that when deleting an event causing recent lists to be updated, views don't get unnecessary change events
+
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0962
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that when deleting an event causing recent lists to be updated,views don't get unnecessary change events.
+                        Check the test work even after backup operations
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents4aL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0962 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	filter->SetFlags(1); // Need to hide an event from the view
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	event->SetFlags(1);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	event->ClearFlags(0xF);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	test(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(view->CountL() == 2);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == 1);
+
+	changeObs1->StartCollectingChanges();
+	changeObs2->StartCollectingChanges();
+
+	// Delete the event in recent list
+	active->StartL();
+	aClient.DeleteEvent(event->Id(), active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	// Check change events
+	test(changeObs2->Changes().Count() == 2);
+	type = changeObs2->Changes().At(0, logId, viewIndex);
+	test(type == ELogChangeTypeEventAdded);
+	type = changeObs2->Changes().At(1, logId, viewIndex);
+	test(type == ELogChangeTypeEventDeleted);
+
+	test(!changeObs1->HaveChanges());
+
+	CleanupStack::PopAndDestroy(7, changeObs1); // changeObs1, changeObs2, view, filter, event, active, recent
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0963
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when recent list cleared
+                        Check the test work even after backup operations
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents5aL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0963 "));
+	TLogId logId;
+	TInt viewIndex;
+	TLogDatabaseChangeType type;
+
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+
+	// Get config
+	TLogConfig config;
+	active->StartL();
+	aClient.GetConfig(config, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add max allowed events
+	TInt count = config.iMaxRecentLogSize;
+	while(count--)
+		{
+		event->SetContact(count+1);
+		active->StartL();
+		aClient.AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		test(active->iStatus == KErrNone);
+		}
+
+	// Setup normal event view
+	active->StartL();
+	test(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == config.iMaxRecentLogSize);
+
+	// Clear recent view
+	active->StartL();
+	aClient.ClearLog(KLogRecentIncomingCalls, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	count = config.iMaxRecentLogSize;
+	test(changeObs2->Changes().Count() == count);
+	while(count--)
+		{
+		type = changeObs2->Changes().At(count, logId, viewIndex);
+		test(type == ELogChangeTypeEventDeleted);
+		}
+
+	// Check recent view
+	test(!recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	// Check change events
+	User::After(100000);
+	test(!changeObs1->HaveChanges());
+
+	CleanupStack::PopAndDestroy(7, changeObs1); // changeObs1, changeObs2, view, filter, event, active, recent
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0964
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when removing events from a recent or duplicate view
+                        Check the test work even after backup operations
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents6aL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0964 "));
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Add a duplicate
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	test(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(view->CountL() == 2);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == 1);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	active->StartL();
+	test(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == 1);
+
+	// Remove duplicate
+	duplicate->RemoveL(duplicate->Event().Id());
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	// Check change events
+	test(!changeObs1->HaveChanges());
+	test(!changeObs2->HaveChanges());
+
+	// Remove recent
+	recent->RemoveL(recent->Event().Id());
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	test(!changeObs1->HaveChanges());
+	test(!changeObs2->HaveChanges()); // No event because we should know we called Remove on ourselves
+
+	CleanupStack::PopAndDestroy(8, changeObs1); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0965
+@SYMTestCaseDesc	    Tests for log view change observer
+@SYMTestPriority 	    High
+@SYMTestActions  	    Check that a view doesn't get change events when clearing duplicates
+                        Check the test work even after backup operations
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestHiddenChangeEvents7aL(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0965 "));
+	CLogViewChangeObserver* changeObs1 = CLogViewChangeObserver::NewLC();
+	changeObs1->StartCollectingChanges();
+
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs1);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	TTime now;
+	now.UniversalTime();
+	now += (TTimeIntervalDays)+1;
+
+	// Get rid of all the events in the log
+	active->StartL();
+	aClient.ClearLog(now, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus.Int() == KErrNone);
+
+	// Incoming call event
+	event->SetEventType(KLogCallEventTypeUid);
+	TBuf<KLogMaxDirectionLength> buf;
+	aClient.GetString(buf, R_LOG_DIR_IN);
+	event->SetDirection(buf);
+
+	// Add an event
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Add a duplicate
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+
+	// Setup normal event view
+	active->StartL();
+	test(view->SetFilterL(*filter, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(view->CountL() == 2);
+
+	CLogViewChangeObserver* changeObs2 = CLogViewChangeObserver::NewLC();
+	changeObs2->StartCollectingChanges();
+
+	CLogViewRecent* recent = CLogViewRecent::NewL(aClient, *changeObs2);
+	CleanupStack::PushL(recent);
+
+	// Check recent view
+	active->StartL();
+	test(recent->SetRecentListL(KLogRecentIncomingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == 1);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Check duplicate count
+	active->StartL();
+	test(recent->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	test(active->iStatus == KErrNone);
+	test(recent->CountL() == 1);
+
+	// Remove duplicate
+	recent->ClearDuplicatesL();
+
+	// Check that changes work after a backup
+	StartBackupL();
+	DelayL(1000000);
+	TestLogClosedL();
+	EndBackupL();
+	TestLogOpenL();
+
+	// Check change events
+	test(!changeObs1->HaveChanges());
+	test(!changeObs2->HaveChanges());
+
+	CleanupStack::PopAndDestroy(8, changeObs1); // changeObs1, changeObs2, view, filter, event, active, recent, duplicate
+	}
+	
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-3511
+@SYMTestCaseDesc	    Tests an error condition for adding an event.                       
+@SYMTestPriority 	    High
+@SYMTestActions  	    A leave will be caused in an observer when a specific event is added. This test 
+                        ensures by successful test completion that there are no panics in this 
+                        situation.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF108741
+*/
+LOCAL_C void DEF108741L(CLogClient& aClient)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-3511 "));
+	// Perform clean up
+ 	TestUtils::DeleteDatabaseL();
+
+	// Create a new event 
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+	event->SetEventType(KLogCallEventTypeUid);
+
+	CTestActive* active = new(ELeave) CTestActive();
+	CleanupStack::PushL(active);
+
+	// Create a change observer. This observer will cause errors in order to verify that 
+	// the system handles them properly.
+	CLogViewChangeObserverErrorTest* changeObs = CLogViewChangeObserverErrorTest::NewLC();
+
+	// Create a view for the event log  
+	CLogViewEvent* view = CLogViewEvent::NewL(aClient, *changeObs);
+	CleanupStack::PushL(view);
+	
+	// Create a filter to specify what events appear in the view
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	TEST(!view->SetFilterL(*filter, active->iStatus));
+	 
+	TInt count;
+	TLogId logId;
+	TInt viewIndex;
+ 
+ 	// This code adds 3 events with ids 0,1 and 2.
+ 	// The observer add event handler :
+ 	// CLogViewChangeObserverErrorTest::HandleLogViewChangeEventAddedL
+ 	// has been written so that it will leave if an event with log id 1 is added.
+ 	// The test completion proves that the leave is dealt with gracefully without 
+ 	// any panics.
+	for(count = 0; count < KTestErrorEventNum; count++)
+		{
+		// Add an event to the log database
+		aClient.AddEvent(*event, changeObs->iStatus);
+		CLogChangeDefinition* changes = changeObs->WaitForChangesLC(CLogViewChangeObserver::EStopOnBoth);
+		
+		// Check the results/notifications are as expected
+		TEST2(changeObs->iStatus.Int(), KErrNone);
+		TEST(event->Id() == (TLogId) count);
+		User::After(1);
+		TEST2(changes->Count(), 1);
+		TEST2(changes->At(0, logId, viewIndex), ELogChangeTypeEventAdded);
+		TEST(logId == (TLogId) count);
+		TEST2(viewIndex, 0);
+		CleanupStack::PopAndDestroy(changes);
+		}
+ 
+	CleanupStack::PopAndDestroy(5, event); // filter, view, changeObs, active, event
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-3716
+@SYMTestCaseDesc	    Tests for the defect INC108225 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for the count of out call list & the duplicates for CS & PS calls
+						The fields to be considered while finding duplicates records are set in the resource file named LOGWRAP.RSS
+						i.e. duplicate = ELogRemotePartyField|ELogContactField|ELogNumberField;
+						Considering this duplicate value, the where clause in the query is made to find duplicate records.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 INC108225
+*/
+LOCAL_C void TestNumberFieldINC108225L(CLogClient& aClient)
+{
+    test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-3716 ")); 
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CLogEvent* event1 = CLogEvent::NewL();
+	CleanupStack::PushL(event1);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogRecentOutgoingCalls, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	TLogString buf1;
+	aClient.GetString(buf1, R_LOG_DIR_OUT);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf1);
+	event->SetDurationType(KLogDurationNone);
+	event->SetContact(KTestContact1);
+	event->SetRemoteParty(KTestRemote1);
+	event->SetNumber(KTestNumber1);
+
+	// Add event 1st CS Call with contact as KTestContact & number as KTestNumber1
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TBool res = view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+		
+	// Set new event with the same contact details (i.e. KTestContact) and 
+	//...event type as KLogCallEventTypeUid & no number field
+	event1->SetEventType(KLogCallEventTypeUid);
+	event1->SetDirection(buf1);
+	event1->SetDurationType(KLogDurationNone);
+	event1->SetContact(KTestContact1);
+	event1->SetRemoteParty(KTestRemote1);
+	
+	// Add event 1st PS Call with contact as KTestContact1 & Number as Null
+	active->StartL();
+	aClient.AddEvent(*event1, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+	
+	// Add event 2nd CS Call
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+	
+	// Check duplicate count for the last call made i.e. CS call
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 1);
+		
+	// Add event 2nd PS Call
+	active->StartL();
+	aClient.AddEvent(*event1, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	// Check duplicate count for the last call made i.e. PS call
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 1);
+	
+	// Add event 3rd CS Call
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+	
+	// Check duplicate count for the last call made i.e. CS call
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 2);
+
+	// Add event 3rd PS Call
+	active->StartL();
+	aClient.AddEvent(*event1, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 2);
+
+	// Check duplicate count for the last call made i.e. PS call
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 2);
+		
+	CleanupStack::PopAndDestroy(5);	
+}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-3755
+@SYMTestCaseDesc	    Tests for the changes made in defect INC108225 for other fields 
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for the count of out call list & the duplicates for CS calls referring other fields
+						The fields to be considered while finding duplicates records are set in the resource file named LOGWRAP.RSS
+						i.e. duplicate = ELogRemotePartyField|ELogContactField|ELogNumberField;
+						Considering this duplicate value, the where clause in the query is made to find duplicate records.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 INC108225
+*/
+LOCAL_C void TestOtherFieldsINC108225L(CLogClient& aClient)
+{
+    test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-3755 ")); 
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogViewRecent* view = CLogViewRecent::NewL(aClient);
+	CleanupStack::PushL(view);
+
+	CLogViewDuplicate* duplicate = CLogViewDuplicate::NewL(aClient);
+	CleanupStack::PushL(duplicate);
+
+	// Make sure there are no entries in any recent lists
+	active->StartL();
+	aClient.ClearLog(KLogRecentOutgoingCalls, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	TLogString buf1;
+	aClient.GetString(buf1, R_LOG_DIR_OUT);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetDirection(buf1);
+	event->SetContact(KTestContact1);
+	event->SetRemoteParty(KTestRemote1);
+	event->SetNumber(KTestNumber1);
+	event->SetDurationType(KLogDurationNone);
+
+	// Add event 1st CS Call with contact as KTestContact & number as KTestNumber1 &
+	//.. durationtype as KLogDurationNone
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TBool res = view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	
+	// Add event 2nd CS Call with duration type as KLogDurationValid
+	event->SetDurationType(KLogDurationValid);
+	
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	
+	// Check duplicate count for the last call made 
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 1);
+	
+	// Add event 3rd CS Call with Flag as KLogNullFlags	
+	event->SetFlags(KLogNullFlags);
+	
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	
+	// Check duplicate count for the last call made 
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 2);
+	
+	// Add event 4th CS Call with Flag as KLogFlagsMask
+	event->SetFlags(KLogFlagsMask);
+	
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	
+	// Check duplicate count for the last call made 
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 3);
+
+	// Add event 5th CS Call with Status as KNullDesC
+	event->SetStatus(KNullDesC);
+	
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	
+	// Check duplicate count for the last call made 
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 4);
+	
+	// Add event 6th CS Call with Status as KTestStatus1
+	event->SetStatus(KTestStatus1);
+	
+	active->StartL();
+	aClient.AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	
+	active->StartL();
+	TEST(view->SetRecentListL(KLogRecentOutgoingCalls, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(active->iStatus.Int(), KErrNone);
+	TEST2(view->CountL(), 1);
+	
+	// Check duplicate count for the last call made
+	active->StartL();
+	TEST(view->DuplicatesL(*duplicate, active->iStatus));
+	CActiveScheduler::Start();
+	TEST2(duplicate->CountL(), 5);
+	
+	CleanupStack::PopAndDestroy(4);	
+}
+
+void doTestsL()
+	{
+	TestUtils::Initialize(_L("T_LOGVIEW2"));
+	TestUtils::DeleteDatabaseL();
+
+	CLogClient* client = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client);
+
+	CLogChangeNotifier* notifier = CLogChangeNotifier::NewL();
+	CleanupStack::PushL(notifier);	
+
+	test.Start(_L("Event View With Filter List"));
+	TestEventViewWithFilterListL(*client);
+	theLog.Write(_L8("Test 1 OK\n"));
+
+	test.Next(_L("View change observer"));
+	TestViewChangeEventsL(*client);
+	theLog.Write(_L8("Test 2 OK\n"));
+
+	test.Next(_L("Recent View With Filter"));
+	TestRecentViewWithFilterL(*client);
+	theLog.Write(_L8("Test 3 OK\n"));
+
+	test.Next(_L("Recent View With Filter List"));
+	TestRecentViewWithFilterListL(*client);
+	theLog.Write(_L8("Test 4 OK\n"));
+
+	test.Next(_L("Duplicate View With Filter"));
+	TestDuplicateViewWithFilterL(*client);
+	theLog.Write(_L8("Test 5 OK\n"));
+
+	test.Next(_L("Duplicate View With Filter List"));
+	TestDuplicateViewWithFilterListL(*client);
+	theLog.Write(_L8("Test 6 OK\n"));
+
+	test.Next(_L("Querying Event View For Null Fields"));
+	TestEventViewForNullFieldsL(*client);
+	theLog.Write(_L8("Test 7 OK\n"));
+
+	test.Next(_L("Querying Recent View For Null Fields"));
+	TestRecentViewForNullFieldsL(*client);
+	theLog.Write(_L8("Test 8 OK\n"));
+
+	test.Next(_L("Querying Duplicate View For Null Fields"));
+	TestDuplicateViewForNullFieldsL(*client);
+	theLog.Write(_L8("Test 9 OK\n"));
+
+	test.Next(_L("Querying Event View For Flags"));
+	TestEventViewForFlagsL(*client);
+	theLog.Write(_L8("Test 10 OK\n"));
+
+	test.Next(_L("Querying Recent View For Flags"));
+	TestRecentViewForFlagsL(*client);
+	theLog.Write(_L8("Test 11 OK\n"));
+
+	test.Next(_L("Querying Duplicate View For Flags"));
+	TestDuplicateViewForFlagsL(*client);
+	theLog.Write(_L8("Test 12 OK\n"));
+
+	test.Next(_L("Removing Recent Events"));
+	TestRemovingRecentEventsL(*client);
+	theLog.Write(_L8("Test 13 OK\n"));
+
+	test.Next(_L("Removing Duplicate Events"));
+	TestRemovingDuplicateEventsL(*client);
+	theLog.Write(_L8("Test 14 OK\n"));
+
+	test.Next(_L("Multiple Views"));
+	TestMultipleViews1L(*client);
+	TestMultipleViews2L(*client);
+	theLog.Write(_L8("Test 15 OK\n"));
+	
+	test.Next(_L("Test _ALT Events In Recent List")); 
+	TestAltEventsInRecentListL(*client);   
+	theLog.Write(_L8("Test 16 OK\n"));
+
+	test.Next(_L("Test filtering Events by time")); 
+	// This TEST sets system's 'Home Time'
+	TestFilterByTimeL(*client);
+	theLog.Write(_L8("Test 17 OK\n"));
+
+	test.Next(_L("Test hidden change events")); 
+	TestUtils::DeleteDatabaseL();
+	TestHiddenChangeEvents1L(*client);
+	TestHiddenChangeEvents1aL(*client);
+	TestHiddenChangeEvents2L(*client);
+	TestHiddenChangeEvents2aL(*client);
+	TestHiddenChangeEvents3L(*client);
+	TestHiddenChangeEvents3aL(*client);
+	TestHiddenChangeEvents4L(*client);
+	TestHiddenChangeEvents4aL(*client);
+	TestHiddenChangeEvents5L(*client);
+	TestHiddenChangeEvents5aL(*client);
+	TestHiddenChangeEvents6L(*client);
+	TestHiddenChangeEvents6aL(*client);
+	TestHiddenChangeEvents7L(*client);
+	TestHiddenChangeEvents7aL(*client);
+	theLog.Write(_L8("Test 18 OK\n"));
+
+	test.Next(_L("Changing events and recent views"));
+	TestChangeEventRecentView1L(*client);
+	TestChangeEventRecentView2L(*client);
+	TestChangeEventRecentViewAndPurgeL(*client);
+	TestChangeEventRecentViewRemoveL(*client);
+	theLog.Write(_L8("Test 19 OK\n"));
+
+	test.Next(_L("Test for DEF066296"));
+	DEF066296L(*client);
+	test.Next(_L("Test for DEF087459"));
+	DEF087459L(*client);
+	theLog.Write(_L8("Test 20 OK\n"));
+
+	test.Next(_L("Event View With Filter List containing StartTime and EndTime"));
+	TestEventViewWithTimestampsInFilterListL(*client);
+	theLog.Write(_L8("Test 21 OK\n"));
+		
+	test.Next(_L("Test for DEF108741 - View change observer, error condition"));
+	DEF108741L(*client);
+	theLog.Write(_L8("Test 22 OK\n"));
+	
+	test.Next(_L("Test Defect INC108225: Call history check for the CS & PS(VOIP) calls "));
+	TestNumberFieldINC108225L(*client);
+	TestOtherFieldsINC108225L(*client);
+	theLog.Write(_L8("Test 23 OK\n"));
+
+	CleanupStack::PopAndDestroy(2); // client, notifier
+	}