diff --git a/src/Make.vars b/src/Make.vars
index 00088b3..bb8da86 100644
--- a/src/Make.vars
+++ b/src/Make.vars
@@ -11,6 +11,7 @@ AM_CPPFLAGS += -include $(top_builddir)/config.h
 # Include paths.
 AM_CPPFLAGS += -I $(top_srcdir)/src/include
 AM_CPPFLAGS += $(OPENFLOW_CPPFLAGS) 
+AM_CPPFLAGS += $(XERCES_CPPFLAGS)
 AM_CPPFLAGS += $(BOOST_CPPFLAGS)
 if LOG4CXX_ENABLED
 AM_CPPFLAGS += -I $(top_srcdir)/src/nox/thirdparty/apache-log4cxx/src/main/include
diff --git a/src/lib/xml-util.cc b/src/lib/xml-util.cc
index 80dc167..e2b376d 100644
--- a/src/lib/xml-util.cc
+++ b/src/lib/xml-util.cc
@@ -72,24 +72,52 @@ const list<DOMNode*> get_children_by_tag(const DOMNode* n, const string& tag) {
 }
 
 /* Initialize the Xerces XML parser */
+
+#if XERCES_VERSION_MAJOR >= 3
+static DOMLSParser*
+#else
 static DOMBuilder*
+#endif
 init_parser() {
     XMLPlatformUtils::Initialize();
     
-    static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull };
-    
-    DOMImplementation *impl = 
-        DOMImplementationRegistry::getDOMImplementation(gLS);
+    XMLCh tempStr[100];
+    XMLString::transcode("LS", tempStr, 99);
+    DOMImplementation *impl =
+        DOMImplementationRegistry::getDOMImplementation(tempStr);
+
+#if XERCES_VERSION_MAJOR >= 3
+    DOMLSParser* parser =
+        ((DOMImplementationLS*)impl)->
+        createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
+#else
     DOMBuilder* parser = ((DOMImplementationLS*)impl)->
         createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
+#endif
+
     try {
+#if XERCES_VERSION_MAJOR >= 3
+        parser->getDomConfig()->setParameter(XMLUni::fgDOMNamespaces, true);
+        parser->getDomConfig()->setParameter(XMLUni::fgDOMValidate, true);
+        parser->getDomConfig()->
+            setParameter(XMLUni::fgDOMElementContentWhitespace, false);
+        parser->getDomConfig()->setParameter(XMLUni::fgXercesSchema, true);
+        parser->getDomConfig()->setParameter(XMLUni::fgXercesSchemaFullChecking,
+                                             false);
+        parser->getDomConfig()->
+            setParameter(XMLUni::fgXercesUseCachedGrammarInParse, true);
+        parser->getDomConfig()->
+            setParameter(XMLUni::fgXercesUserAdoptsDOMDocument, true);
+#else
         parser->setFeature(XMLUni::fgDOMNamespaces, true);
         parser->setFeature(XMLUni::fgDOMValidation, true);
         parser->setFeature(XMLUni::fgDOMWhitespaceInElementContent, false);
         parser->setFeature(XMLUni::fgXercesSchema, true);
         parser->setFeature(XMLUni::fgXercesSchemaFullChecking, false);
-        parser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);        
+        parser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);
         parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument, true);
+#endif
+
         return parser;
     }
     catch (...) {
@@ -102,7 +130,12 @@ DOMDocument*  load_document(const string& schema, const string& file,
     error_message = "";
     VigilDOMErrorHandler err_handler(error_message);
     DOMDocument* doc = 0;
+#if XERCES_VERSION_MAJOR >= 3
+    DOMLSParser* parser = init_parser();
+#else
     DOMBuilder* parser = init_parser();
+#endif
+
     if (!parser) {
         error_message = "XML parser initialization failure.";
         return 0;
@@ -114,9 +147,16 @@ DOMDocument*  load_document(const string& schema, const string& file,
         MemBufInputSource mbis(s, schema.size(), 
                                const_cast<char*>(schema_path.c_str()));
         Wrapper4InputSource w4is(&mbis, false);
-        parser->loadGrammar(w4is, Grammar::SchemaGrammarType, true);        
 
+#if XERCES_VERSION_MAJOR >= 3
+        parser->loadGrammar(&w4is, Grammar::SchemaGrammarType, true);
+        parser->getDomConfig()->setParameter(XMLUni::fgDOMErrorHandler,
+                                             &err_handler);
+#else
+        parser->loadGrammar(w4is, Grammar::SchemaGrammarType, true);
         parser->setErrorHandler(&err_handler);
+#endif
+
         doc = parser->parseURI(file.c_str());
         
         if (error_message != "") { 
