--- a/libupnpp/device/vdir.cxx
+++ b/libupnpp/device/vdir.cxx
@@ -33,6 +33,13 @@
 using namespace std;
 using namespace UPnPP;
 
+#if UPNP_VERSION_MAJOR > 1 || (UPNP_VERSION_MAJOR==1 && UPNP_VERSION_MINOR >= 8)
+#define V18VDIR 1
+#else
+#undef V18VDIR
+typedef struct File_Info UpnpFileInfo;
+#endif
+
 namespace UPnPProvider {
 
 static VirtualDir *theDir;
@@ -104,7 +111,12 @@
 
     if (m_dirs.find(path) == m_dirs.end()) {
 	m_dirs[path] = DirEnt();
-        UpnpAddVirtualDir(path.c_str());
+        
+        UpnpAddVirtualDir(path.c_str()
+#ifdef V18VDIR
+                          , 0, 0
+#endif
+            );
     }
 
     FileEnt entry;
@@ -123,7 +135,11 @@
     pathcatslash(path);
     if (m_dirs.find(path) == m_dirs.end()) {
 	m_dirs[path] = DirEnt(true);
-        UpnpAddVirtualDir(path.c_str());
+        UpnpAddVirtualDir(path.c_str()
+#ifdef V18VDIR
+                          , 0, 0
+#endif
+            );
     }
     m_dirs[path].ops = fops;
     return true;
@@ -143,7 +159,11 @@
     size_t offset;
 };
 
-static int vdclose(UpnpWebFileHandle fileHnd)
+static int vdclose(UpnpWebFileHandle fileHnd
+#if V18VDIR
+                   , const void*
+#endif
+    )
 {
     Handle *h = (Handle*)fileHnd;
     if (h->vhandle) {
@@ -153,7 +173,11 @@
     return 0;
 }
 
-static int vdgetinfo(const char *fn, struct File_Info* info)
+static int vdgetinfo(const char *fn, UpnpFileInfo* info
+#if V18VDIR
+                     , const void*
+#endif
+    )
 {
     //LOGDEB("vdgetinfo: [" << fn << "] off_t " << sizeof(off_t) <<
     // " time_t " << sizeof(time_t) << endl);
@@ -163,11 +187,20 @@
 	VirtualDir::FileInfo inf;
 	int ret = dir->ops.getinfo(fn, &inf);
 	if (ret >= 0) {
+#if V18VDIR
+	    UpnpFileInfo_set_FileLength(info, inf.file_length);
+	    UpnpFileInfo_set_LastModified(info, inf.last_modified);
+	    UpnpFileInfo_set_IsDirectory(info, inf.is_directory);
+	    UpnpFileInfo_set_IsReadable(info, inf.is_readable);
+	    UpnpFileInfo_set_ContentType(info,
+                                         ixmlCloneDOMString(inf.mime.c_str()));
+#else
 	    info->file_length = inf.file_length;
 	    info->last_modified = inf.last_modified;
 	    info->is_directory = inf.is_directory;
 	    info->is_readable =  inf.is_readable;
 	    info->content_type = ixmlCloneDOMString(inf.mime.c_str());
+#endif
 	}
 	return ret;
     }
@@ -176,16 +209,29 @@
         return -1;
     }
 
+#if V18VDIR
+    UpnpFileInfo_set_FileLength(info, entry->content.size());
+    UpnpFileInfo_set_LastModified(info, entry->mtime);
+    UpnpFileInfo_set_IsDirectory(info, 0);
+    UpnpFileInfo_set_IsReadable(info, 1);
+    UpnpFileInfo_set_ContentType(info,
+                                 ixmlCloneDOMString(entry->mimetype.c_str()));
+#else
     info->file_length = entry->content.size();
     info->last_modified = entry->mtime;
     info->is_directory = 0;
     info->is_readable = 1;
     info->content_type = ixmlCloneDOMString(entry->mimetype.c_str());
+#endif
 
     return 0;
 }
 
-static UpnpWebFileHandle vdopen(const char* fn, enum UpnpOpenFileMode)
+static UpnpWebFileHandle vdopen(const char* fn, enum UpnpOpenFileMode
+#if V18VDIR
+                                , const void*
+#endif
+    )
 {
     //LOGDEB("vdopen: " << fn << endl);
     DirEnt *dir;
@@ -207,7 +253,11 @@
     return new Handle(entry);
 }
 
-static int vdread(UpnpWebFileHandle fileHnd, char* buf, size_t buflen)
+static int vdread(UpnpWebFileHandle fileHnd, char* buf, size_t buflen
+#if V18VDIR
+                  , const void*
+#endif
+    )
 {
     // LOGDEB("vdread: " << endl);
     if (buflen == 0) {
@@ -228,7 +278,11 @@
     return toread;
 }
 
-static int vdseek(UpnpWebFileHandle fileHnd, off_t offset, int origin)
+static int vdseek(UpnpWebFileHandle fileHnd, off_t offset, int origin
+#if V18VDIR
+                  , const void*
+#endif
+    )
 {
     // LOGDEB("vdseek: " << endl);
     Handle *h = (Handle *)fileHnd;
@@ -247,12 +301,36 @@
     return offset;
 }
 
-static int vdwrite(UpnpWebFileHandle, char*, size_t)
+static int vdwrite(UpnpWebFileHandle, char*, size_t
+#if V18VDIR
+                  , const void*
+#endif
+    )
 {
     LOGERR("vdwrite" << endl);
     return -1;
 }
 
+#if V18VDIR
+VirtualDir *VirtualDir::getVirtualDir()
+{
+    if (theDir == 0) {
+        theDir = new VirtualDir();
+        if (UpnpVirtualDir_set_GetInfoCallback(vdgetinfo) || 
+            UpnpVirtualDir_set_OpenCallback(vdopen) ||
+            UpnpVirtualDir_set_ReadCallback(vdread) || 
+            UpnpVirtualDir_set_WriteCallback(vdwrite) ||
+            UpnpVirtualDir_set_SeekCallback(vdseek) ||
+            UpnpVirtualDir_set_CloseCallback(vdclose)) {
+            LOGERR("SetVirtualDirCallbacks failed" << endl);
+            delete theDir;
+            theDir = 0;
+            return 0;
+        }
+    }
+    return theDir;
+}
+#else
 static struct UpnpVirtualDirCallbacks myvdcalls = {
     vdgetinfo, vdopen, vdread, vdwrite, vdseek, vdclose
 };
@@ -270,5 +348,6 @@
     }
     return theDir;
 }
-
-}
+#endif
+
+}