Index: /issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.cpp	(revision 11319)
@@ -229,4 +229,59 @@
 /*}}}*/
 
+/*FUNCTION  KMLFileTagName {{{1*/
+char* KMLFileTagName(char* pname,
+					 char* ktag){
+
+	return(KMLFileTagName(pname,NULL,0,
+						  ktag));
+}
+/*}}}*/
+
+/*FUNCTION  KMLFileTagName {{{1*/
+char* KMLFileTagName(char* pname,int *m,int maxlen,
+					 char* ktag){
+
+/*  for the given tag buffer, read and store the name  */
+
+	char*   ktagi;
+	char*   ktokn;
+
+	if (strncmp(&ktag[0],"<"        ,1) || strncmp(&ktag[strlen(ktag)-1],">",1))
+		_error_("KMLFileTagName -- Missing tag delimiters in %s.\n",ktag);
+
+/*  strtok modifies ktag, so work on copy  */
+
+	ktagi=(char *) xmalloc((strlen(ktag)+1)*sizeof(char));
+	memcpy(ktagi,ktag,(strlen(ktag)+1)*sizeof(char));
+
+/*  skip opening delimeter and find subsequent blank or closing delimiter  */
+
+	ktokn=strtok(ktagi,"< >");
+//	_printf_(true,"KMLFileTagName -- initial token=\"%s\".\n",ktokn);
+
+	if (!pname) {
+		if (maxlen)
+			pname=(char *) xmalloc((maxlen       +1)*sizeof(char));
+		else
+			pname=(char *) xmalloc((strlen(ktokn)+1)*sizeof(char));
+	}
+
+	if (maxlen && (maxlen < strlen(ktokn))) {
+		_printf_(true,"KMLFileTagName -- string field too short for %s.\n",ktag);
+		_printf_(true,"KMLFileTagName -- \"%s\" truncated to %d characters.\n",ktokn,maxlen);
+		strncpy(pname,ktokn,maxlen);
+	}
+	else
+		memcpy(pname,ktokn,(strlen(ktokn)+1)*sizeof(char));
+
+	xfree((void**)&ktagi);
+
+	if (m)
+		*m=strlen(pname);
+
+	return(pname);
+}
+/*}}}*/
+
 /*FUNCTION  KMLFileTagAttrib {{{1*/
 int KMLFileTagAttrib(KML_Object* kobj,
@@ -352,4 +407,15 @@
 
 /*FUNCTION  KMLFileTokenParse {{{1*/
+char* KMLFileTokenParse(char* pstr,
+						char* ktag,
+						FILE* fid){
+
+	return(KMLFileTokenParse(pstr,NULL,0,
+							 ktag,
+							 fid));
+}
+/*}}}*/
+
+/*FUNCTION  KMLFileTokenParse {{{1*/
 char* KMLFileTokenParse(char* pstr,int *m,int maxlen,
 						char* ktag,
@@ -357,5 +423,4 @@
 
 	char*   kstr;
-	char*   pstro=NULL;
 
 /*  get next token and allocate if necessary  */
@@ -371,5 +436,4 @@
 		else
 			pstr=(char *) xmalloc((strlen(kstr)+1)*sizeof(char));
-		pstro=pstr;
 	}
 
@@ -401,5 +465,5 @@
 //	_printf_(true,"KMLFileTokenParse -- %s=\"%s\".\n",ktag,pstr);
 
-	return(pstro);
+	return(pstr);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.h
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.h	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.h	(revision 11319)
@@ -21,4 +21,8 @@
 						int c,
 						int bufblk);
+char* KMLFileTagName(char* pname,
+					 char* ktag);
+char* KMLFileTagName(char* pname,int *m,int maxlen,
+					 char* ktag);
 int KMLFileTagAttrib(KML_Object* kobj,
 					 char* ktag);
@@ -29,7 +33,10 @@
 					  char* ktag,
 					  FILE* fid);
+char* KMLFileTokenParse(char* pstr,
+						char* ktag,
+						FILE* fid);
 char* KMLFileTokenParse(char* pstr,int *m,int maxlen,
-					  char* ktag,
-					  FILE* fid);
+						char* ktag,
+						FILE* fid);
 int KMLFileTokenParse(float* pfval,
 					  char* ktag,
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Container.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Container.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Container.cpp	(revision 11319)
@@ -74,5 +74,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Feature.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Feature.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Feature.cpp	(revision 11319)
@@ -96,5 +96,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_File.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_File.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_File.cpp	(revision 11319)
@@ -76,5 +76,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_GroundOverlay.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_GroundOverlay.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_GroundOverlay.cpp	(revision 11319)
@@ -80,5 +80,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_MultiGeometry.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_MultiGeometry.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_MultiGeometry.cpp	(revision 11319)
@@ -78,5 +78,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Object.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Object.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Object.cpp	(revision 11319)
@@ -26,4 +26,5 @@
 	attrib    =new DataSet;
 	commnt    =new DataSet;
+	unknwn    =new DataSet;
 
 }
@@ -40,4 +41,8 @@
 		commnt    =NULL;
 	}
+	if (unknwn) {
+		delete unknwn;
+		unknwn    =NULL;
+	}
 
 }
@@ -52,4 +57,5 @@
 	_printf_(flag,"        attrib: (size=%d)\n" ,attrib->Size());
 	_printf_(flag,"        commnt: (size=%d)\n" ,commnt->Size());
+	_printf_(flag,"        unknwn: (size=%d)\n" ,unknwn->Size());
 
 	return;
@@ -90,4 +96,13 @@
 		_printf_(flag,"%s        commnt: [empty]\n"    ,indent);
 
+/*  loop over the unknown objects for the object  */
+
+	if (unknwn->Size())
+		for (i=0; i<unknwn->Size(); i++) {
+			((KML_Unknown *)unknwn->GetObjectByOffset(i))->DeepEcho(indent);
+		}
+	else
+		_printf_(flag,"%s        unknwn: [empty]\n"    ,indent);
+
 	return;
 }
@@ -96,8 +111,19 @@
 void  KML_Object::Write(FILE* filout,const char* indent){
 
+	int   i;
+	char  indent2[81];
+
 //  attributes always written in keyword line of derived classes
 //  comments always written after keyword line of derived classes
 
-	;
+/*  loop over the unknown objects for the object  */
+
+	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
+	strcat(indent2,"  ");
+
+	if (unknwn->Size())
+		for (i=0; i<unknwn->Size(); i++) {
+			((KML_Unknown *)unknwn->GetObjectByOffset(i))->Write(filout,indent2);
+		}
 
 	return;
@@ -106,4 +132,6 @@
 /*FUNCTION KML_Object::Read {{{1*/
 void  KML_Object::Read(FILE* fid,char* kstr){
+
+	KML_Object*  kobj;
 
 /*  process field within opening and closing tags  */
@@ -118,6 +146,9 @@
 	else if (!strncmp(kstr,"<",1)) {
 		_printf_(true,"KML_Object::Read -- Unrecognized opening tag %s.\n",kstr);
-		KMLFileTagSkip(kstr,
-					   fid);
+//		KMLFileTagSkip(kstr,
+//					   fid);
+		kobj=(KML_Object*)new KML_Unknown();
+		kobj->Read(fid,kstr);
+		unknwn    ->AddObject((Object*)kobj);
 	}
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Object.h
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Object.h	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Object.h	(revision 11319)
@@ -21,4 +21,5 @@
 		DataSet* attrib;
 		DataSet* commnt;
+		DataSet* unknwn;
 
 		/*KML_Object constructors, destructors {{{1*/
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Overlay.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Overlay.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Overlay.cpp	(revision 11319)
@@ -79,5 +79,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Placemark.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Placemark.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Placemark.cpp	(revision 11319)
@@ -76,5 +76,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Polygon.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Polygon.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Polygon.cpp	(revision 11319)
@@ -92,5 +92,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
@@ -134,5 +133,4 @@
 
 	memcpy(indent4,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent4,"    ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Style.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Style.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Style.cpp	(revision 11319)
@@ -109,5 +109,4 @@
 
 	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
-
 	strcat(indent2,"  ");
 
Index: /issm/trunk-jpl/src/c/objects/KML/KML_Unknown.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/KML/KML_Unknown.cpp	(revision 11318)
+++ /issm/trunk-jpl/src/c/objects/KML/KML_Unknown.cpp	(revision 11319)
@@ -80,4 +80,6 @@
 void  KML_Unknown::Write(FILE* filout,const char* indent){
 
+	char  indent2[81];
+
 	fprintf(filout,"%s<%s",indent,name);
 	WriteAttrib(filout," ");
@@ -85,8 +87,11 @@
 	WriteCommnt(filout,indent);
 
-	KML_Object::Write(filout,indent);
-
 	if (value     )
 		fprintf(filout,"%s  %s\n",indent,value);
+
+	memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
+	strcat(indent2,"  ");
+
+	KML_Object::Write(filout,indent2);
 
 	fprintf(filout,"%s</%s>\n",indent,name);
@@ -102,4 +107,10 @@
 	char**       pcom=NULL;
 
+/*  get object name  */
+
+	name=KMLFileTagName(NULL,
+						kstr);
+//	_printf_(true,"KML_Unknown::Read -- opening name=%s.\n",name);
+
 /*  get object attributes and check for solo tag  */
 
@@ -112,6 +123,8 @@
 	while (kstri=KMLFileToken(fid,
 							  &ncom,&pcom)) {
+//		_printf_(true,"KML_Unknown::Read -- kstri=%s.\n",kstri);
 		if      (!strncmp(&kstri[0],"</", 2) &&
 				 !strncmp(&kstri[2],name,strlen(name))) {
+//			_printf_(true,"KML_Unknown::Read -- closing name=%s.\n",name);
 			xfree((void**)&kstri);
 			break;
@@ -120,8 +133,8 @@
 			_error_("KML_Unknown::Read -- Unexpected closing tag %s.\n",kstri);
 
-		else if (strncmp(kstri,"<",1))
-			KMLFileTokenParse( value     ,NULL,0,
-							  NULL,
-							  fid);
+		else if (strncmp(kstri,"<",1)) {
+			value=(char *) xmalloc((strlen(kstri)+1)*sizeof(char));
+			memcpy(value,kstri,(strlen(kstri)+1)*sizeof(char));
+		}
 
 		else if (!strncmp(kstri,"<",1))
