/// <summary>
        /// Create a repsonse for a PROPFIND request (Directory(File)-Listing
        /// </summary>
        /// <param name="properties"></param>
        /// <returns></returns>
        private Byte[] CreatePropfindResponse(HTTPHeader header, PropfindProperties propfindProperties, HashSet<String> _DestinationObjectStreamTypes, params string[] properties)
        {
            #region Create XmlDocument

            XmlDocument XmlDocument = new XmlDocument();

            //XmlDeclaration xmlDeclaration = XmlDocument.CreateXmlDeclaration("1.0", "utf-8", "");
            //XmlDocument.AppendChild(xmlDeclaration);

            XmlElement Root = XmlDocument.CreateElement(S_DAV_PREFIX, "multistatus", S_DAV_NAMESPACE_URI);
            //Root.SetAttribute("xmlns:" + S_SVN_PREFIX, S_SVN_NAMESPACE_URI);

            if (header.GetDepth() == WebDAVDepth.Depth0)
            {
                Root.AppendChild(CreateDepth0Response(header, XmlDocument, propfindProperties, _DestinationObjectStreamTypes));
            }

            Boolean IsLegalDir = true;
            if (S_INVALID_DIRECTORIES.Contains(String.Concat("|", DirectoryHelper.GetObjectName(header.Destination), "|")))
                IsLegalDir = false;

            var directoryObjectR = _AGraphDSSharp.GetFSObject<DirectoryObject>(ObjectLocation.ParseString(header.Destination), FSConstants.DIRECTORYSTREAM, null, null, 0, false);
            // uncommented because _AGraphDSSharp.isIDirectoryObject is odd
            //if (IsLegalDir && _AGraphDSSharp.isIDirectoryObject(ObjectLocation.ParseString((header.Destination)) == Trinary.TRUE)
            if (IsLegalDir && directoryObjectR.Success())
            {
                #region root elements

                if (header.GetDepth() != WebDAVDepth.Depth0)
                {
                    // Get Content of the Current Directory
                    var DirectoryObject = directoryObjectR.Value;
                    foreach (DirectoryEntryInformation actualDirectoryEntry in DirectoryObject.GetExtendedDirectoryListing())
                    {

                        //if (((String)DirectoryEntries["ObjectName"]).Contains(".forest") || ((String)DirectoryEntries["ObjectName"]).Contains(".fs") || ((String)DirectoryEntries["ObjectName"]).Contains(".metadata") || ((String)DirectoryEntries["ObjectName"]).Contains(".revisions") || ((String)DirectoryEntries["ObjectName"]).Contains(".vfs"))
                        if (S_INVALID_DIRECTORIES.Contains(String.Concat("|", actualDirectoryEntry.Name)))
                            continue;

                        String ObjectDestination = header.Destination + (header.Destination.EndsWith("/") ? "" : FSPathConstants.PathDelimiter) + actualDirectoryEntry.Name;

                        if (actualDirectoryEntry.Streams.Contains(FSConstants.DIRECTORYSTREAM))
                        {
                            try
                            {
                                IDirectoryObject CurDirectoryObject = _AGraphDSSharp.GetFSObject<DirectoryObject>(ObjectLocation.ParseString(ObjectDestination), FSConstants.DIRECTORYSTREAM, null, null, 0, false).Value;
                                String HRef = header.FullHTTPDestinationPath() + (header.FullHTTPDestinationPath().EndsWith("/") ? "" : FSPathConstants.PathDelimiter) + actualDirectoryEntry.Name;
                                XmlElement XmlElement = CreateResponseElement_Dir(header, XmlDocument, HRef, actualDirectoryEntry.Name, CurDirectoryObject, propfindProperties);
                                Root.AppendChild(XmlElement);
                            }
                            catch
                            {
                            }
                        }

                        else if (actualDirectoryEntry.Streams.Contains(FSConstants.FILESTREAM))
                        {
                            String HRef = header.FullHTTPDestinationPath() + (header.FullHTTPDestinationPath().EndsWith("/") ? "" : FSPathConstants.PathDelimiter) + actualDirectoryEntry.Name;
                            //INode INode = _AGraphDSSharp.ExportINode(ObjectLocation.ParseString((ObjectDestination));
                            UInt64 Size = (UInt64)_AGraphDSSharp.GetFSObject<FileObject>(ObjectLocation.ParseString(ObjectDestination), FSConstants.FILESTREAM, null, null, 0, false).Value.ObjectData.Length;
                            XmlElement ResponseElement_File = CreateResponseElement_File(header, XmlDocument, HRef, actualDirectoryEntry.Name, System.Net.Mime.MediaTypeNames.Text.Plain, Size, propfindProperties);
                            Root.AppendChild(ResponseElement_File);
                        }

                        else if (actualDirectoryEntry.Streams.Contains(FSConstants.SYMLINK))
                        {
                            String HRef = header.FullHTTPDestinationPath() + (header.FullHTTPDestinationPath().EndsWith("/") ? "" : FSPathConstants.PathDelimiter) + actualDirectoryEntry.Name;
                            Root.AppendChild(CreateResponseElement_Dir(header, XmlDocument, HRef, actualDirectoryEntry.Name, null, propfindProperties));
                        }

                        else if (actualDirectoryEntry.Streams.Contains(FSConstants.INLINEDATA))
                        {

                            String HRef = header.FullHTTPDestinationPath() + (header.FullHTTPDestinationPath().EndsWith("/") ? "" : FSPathConstants.PathDelimiter) + actualDirectoryEntry.Name;
                            Byte[] Inlinedata = DirectoryObject.GetInlineData(actualDirectoryEntry.Name);

                            // Return CreationTime and LastModificationTime of the DirectoryObject!
                            var _CreationTime = DateTime.Now;
                            var _LastModificationTime = DateTime.Now;

                            var _AGraphObject = DirectoryObject as AFSObject;

                            if (_AGraphObject != null)
                                if (_AGraphObject.INodeReference != null)
                                {
                                    _CreationTime = new DateTime((Int64)_AGraphObject.INodeReference.CreationTime);
                                    _LastModificationTime = new DateTime((Int64)_AGraphObject.INodeReference.LastModificationTime);
                                }

                            Root.AppendChild(
                                CreateResponseElement_File(
                                    header,
                                    XmlDocument,
                                    HRef,
                                    actualDirectoryEntry.Name,
                                    System.Net.Mime.MediaTypeNames.Text.Plain,
                                    (UInt64)Inlinedata.Length,
                                    _LastModificationTime,
                                    _CreationTime,
                                    propfindProperties
                                )
                            );

                        }

                        //else
                        //    Root.AppendChild(CreateResponseElement_Dir(XmlDocument, actualDirectoryEntry.StreamTypes + ":" + actualDirectoryEntry.myLogin, actualDirectoryEntry.StreamTypes + actualDirectoryEntry.myLogin, null, myPropfindProperties));
                    }

                }

                #endregion
            }

            XmlDocument.AppendChild(Root);

            #endregion

            #region Stream XmlDocument to ByteArray

            XmlWriterSettings settings;
            settings = new XmlWriterSettings();
            settings.Encoding = Encoding.UTF8;

            using (MemoryStream stream = new MemoryStream())
            {

                using (XmlWriter writer = XmlWriter.Create(stream, settings))
                {

                    XmlDocument.WriteContentTo(writer);

                    writer.Flush();

                    return CleanContent(stream.ToArray());

                }

            }

            #endregion
        }