internal void EndShutdown()
        {
            if (_status != DekiInstanceStatus.STOPPING)
            {
                _log.WarnFormat("EndShutdown was attemped with instance in state {0}", _status);
                throw new InvalidOperationException("bad state");
            }

            // shut down task timer
            try {
                TimerFactory.Dispose();
            } catch (Exception e) {
                _log.Warn(string.Format("unable to shut down timerfactory for instance '{0}': {1}", Id, e.Message), e);
            }

            // shut down storage
            _log.DebugFormat("shutting down storage for '{0}'", Id);
            try {
                _storage.Dispose();
            } catch (Exception e) {
                _log.Warn(string.Format("unable to cleanly shut down storage for instance '{0}': {1}", Id, e.Message), e);
            }
            _storage = null;

            // shut down services
            _log.DebugFormat("shutting down services for '{0}'", Id);
            try {
                ServiceBL.StopServices();

                // reset instance fields
                RunningServices.Clear();
            } catch (Exception e) {
                _log.Warn(string.Format("unable to cleanly shut down services for instance '{0}': {1}", Id, e.Message), e);
            }

            // shutting down cache
            try {
                Cache.Dispose();
            } catch (Exception e) {
                _log.Warn(string.Format("unable to dispose the cache for instance '{0}': {1}", Id, e.Message), e);
            }

            // shutting down search cache
            try {
                SearchCache.Dispose();
            } catch (Exception e) {
                _log.Warn(string.Format("unable to dispose the search cache for instance '{0}': {1}", Id, e.Message), e);
            }

            // sending shut down event
            try {
                _eventSink.InstanceShutdown(DekiContext.Current.Now);
            } catch (Exception e) {
                _log.Warn(string.Format("unable to send the shutdown notification event for instance '{0}': {1}", Id, e.Message), e);
            }
            _eventSink = null;

            // unregister the instance to database mapping
            if (null != _sessionFactory)
            {
                try {
                    _sessionFactory.Dispose();
                } catch (Exception e) {
                    _log.Warn(string.Format("unable to cleanly shut down the session factory for instance '{0}': {1}", Id, e.Message), e);
                }
                _sessionFactory = null;
            }
            _log.DebugFormat("instance '{0}' stopped", Id);
            _status = DekiInstanceStatus.STOPPED;
        }