public async Task AddSubscriptionAsync()
        {
            var subscription = new Subscription();

            // check keepAlive
            int keepAlive = 0;

            m_session.KeepAlive += (Session sender, KeepAliveEventArgs e) => { keepAlive++; };

            // add current time
            var list = new List <MonitoredItem> {
                new MonitoredItem(subscription.DefaultItem)
                {
                    DisplayName = "ServerStatusCurrentTime", StartNodeId = VariableIds.Server_ServerStatus_CurrentTime
                }
            };

            list.ForEach(i => i.Notification += (MonitoredItem item, MonitoredItemNotificationEventArgs e) => {
                foreach (var value in item.DequeueValues())
                {
                    TestContext.Out.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
                }
            });

            subscription = new Subscription(m_session.DefaultSubscription);
            TestContext.Out.WriteLine("MaxMessageCount: {0}", subscription.MaxMessageCount);
            TestContext.Out.WriteLine("MaxNotificationsPerPublish: {0}", subscription.MaxNotificationsPerPublish);
            TestContext.Out.WriteLine("MinLifetimeInterval: {0}", subscription.MinLifetimeInterval);

            subscription.AddItem(list.First());
            Assert.AreEqual(1, subscription.MonitoredItemCount);
            Assert.True(subscription.ChangesPending);
            bool result = await m_session.RemoveSubscriptionAsync(subscription);

            Assert.False(result);
            result = await m_session.RemoveSubscriptionsAsync(new List <Subscription>() { subscription });

            Assert.False(result);
            result = m_session.AddSubscription(subscription);
            Assert.True(result);
            result = m_session.AddSubscription(subscription);
            Assert.False(result);
            result = await m_session.RemoveSubscriptionsAsync(new List <Subscription>() { subscription });

            Assert.True(result);
            result = await m_session.RemoveSubscriptionAsync(subscription);

            Assert.False(result);
            result = m_session.AddSubscription(subscription);
            Assert.True(result);
            await subscription.CreateAsync().ConfigureAwait(false);

            // add state
            var list2 = new List <MonitoredItem> {
                new MonitoredItem(subscription.DefaultItem)
                {
                    DisplayName = "ServerStatusState", StartNodeId = VariableIds.Server_ServerStatus_State
                }
            };

            list2.ForEach(i => i.Notification += (MonitoredItem item, MonitoredItemNotificationEventArgs e) => {
                foreach (var value in item.DequeueValues())
                {
                    TestContext.Out.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
                }
            });
            subscription.AddItems(list);
            await subscription.ApplyChangesAsync().ConfigureAwait(false);

            await subscription.SetPublishingModeAsync(false).ConfigureAwait(false);

            Assert.False(subscription.PublishingEnabled);
            await subscription.SetPublishingModeAsync(true).ConfigureAwait(false);

            Assert.True(subscription.PublishingEnabled);
            Assert.False(subscription.PublishingStopped);

            subscription.Priority = 200;
            await subscription.ModifyAsync().ConfigureAwait(false);

            // save
            m_session.Save(SubscriptionTestXml);

            await Task.Delay(5000).ConfigureAwait(false);

            TestContext.Out.WriteLine("CurrentKeepAliveCount   : {0}", subscription.CurrentKeepAliveCount);
            TestContext.Out.WriteLine("CurrentPublishingEnabled: {0}", subscription.CurrentPublishingEnabled);
            TestContext.Out.WriteLine("CurrentPriority         : {0}", subscription.CurrentPriority);
            TestContext.Out.WriteLine("PublishTime             : {0}", subscription.PublishTime);
            TestContext.Out.WriteLine("LastNotificationTime    : {0}", subscription.LastNotificationTime);
            TestContext.Out.WriteLine("SequenceNumber          : {0}", subscription.SequenceNumber);
            TestContext.Out.WriteLine("NotificationCount       : {0}", subscription.NotificationCount);
            TestContext.Out.WriteLine("LastNotification        : {0}", subscription.LastNotification);
            TestContext.Out.WriteLine("Notifications           : {0}", subscription.Notifications.Count());
            TestContext.Out.WriteLine("OutstandingMessageWorker: {0}", subscription.OutstandingMessageWorkers);

            await subscription.ConditionRefreshAsync().ConfigureAwait(false);

            var sre = Assert.Throws <ServiceResultException>(() => subscription.Republish(subscription.SequenceNumber));

            Assert.AreEqual(StatusCodes.BadMessageNotAvailable, sre.StatusCode);

            subscription.RemoveItems(list);
            await subscription.ApplyChangesAsync().ConfigureAwait(false);

            subscription.RemoveItem(list2.First());

            result = await m_session.RemoveSubscriptionAsync(subscription).ConfigureAwait(false);

            Assert.True(result);
        }