diff --git a/lib/Bytecode/Archive/Archive.cpp b/lib/Bytecode/Archive/Archive.cpp
index 8e40590..2d79bd6 100644
--- a/lib/Bytecode/Archive/Archive.cpp
+++ b/lib/Bytecode/Archive/Archive.cpp
@@ -26,7 +26,7 @@
 
   // If it has a long filename, include the name length
   if (hasLongFilename())
-    result += path.get().length() + 1;
+    result += path.toString().length() + 1;
 
   // If its now odd lengthed, include the padding byte
   if (result % 2 != 0 ) 
@@ -66,38 +66,38 @@
   path = newFile;
 
   // SVR4 symbol tables have an empty name
-  if (path.get() == ARFILE_SVR4_SYMTAB_NAME)
+  if (path.toString() == ARFILE_SVR4_SYMTAB_NAME)
     flags |= SVR4SymbolTableFlag;
   else
     flags &= ~SVR4SymbolTableFlag;
 
   // BSD4.4 symbol tables have a special name
-  if (path.get() == ARFILE_BSD4_SYMTAB_NAME)
+  if (path.toString() == ARFILE_BSD4_SYMTAB_NAME)
     flags |= BSD4SymbolTableFlag;
   else
     flags &= ~BSD4SymbolTableFlag;
 
   // LLVM symbol tables have a very specific name
-  if (path.get() == ARFILE_LLVM_SYMTAB_NAME)
+  if (path.toString() == ARFILE_LLVM_SYMTAB_NAME)
     flags |= LLVMSymbolTableFlag;
   else
     flags &= ~LLVMSymbolTableFlag;
 
   // String table name
-  if (path.get() == ARFILE_STRTAB_NAME)
+  if (path.toString() == ARFILE_STRTAB_NAME)
     flags |= StringTableFlag;
   else
     flags &= ~StringTableFlag;
 
   // If it has a slash then it has a path
-  bool hasSlash = path.get().find('/') != std::string::npos;
+  bool hasSlash = path.toString().find('/') != std::string::npos;
   if (hasSlash)
     flags |= HasPathFlag;
   else
     flags &= ~HasPathFlag;
 
   // If it has a slash or its over 15 chars then its a long filename format
-  if (hasSlash || path.get().length() > 15)
+  if (hasSlash || path.toString().length() > 15)
     flags |= HasLongFilenameFlag;
   else
     flags &= ~HasLongFilenameFlag;
diff --git a/lib/Bytecode/Archive/ArchiveReader.cpp b/lib/Bytecode/Archive/ArchiveReader.cpp
index 34b36a6..b00487f 100644
--- a/lib/Bytecode/Archive/ArchiveReader.cpp
+++ b/lib/Bytecode/Archive/ArchiveReader.cpp
@@ -295,8 +295,8 @@
 
   for (iterator I=begin(), E=end(); I != E; ++I) {
     if (I->isBytecode() || I->isCompressedBytecode()) {
-      std::string FullMemberName = archPath.get() + 
-        "(" + I->getPath().get() + ")";
+      std::string FullMemberName = archPath.toString() + 
+        "(" + I->getPath().toString() + ")";
       Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(), 
           I->getSize(), FullMemberName, ErrMessage);
       if (!M)
@@ -407,8 +407,8 @@
   ArchiveMember* mbr = parseMemberHeader(modptr, base + mapfile->size());
 
   // Now, load the bytecode module to get the ModuleProvider
-  std::string FullMemberName = archPath.get() + "(" + 
-    mbr->getPath().get() + ")";
+  std::string FullMemberName = archPath.toString() + "(" + 
+    mbr->getPath().toString() + ")";
   ModuleProvider* mp = getBytecodeBufferModuleProvider(
       (const unsigned char*) mbr->getData(), mbr->getSize(), 
       FullMemberName, 0);
@@ -446,8 +446,8 @@
       if (mbr->isBytecode() || mbr->isCompressedBytecode()) {
         // Get the symbols 
         std::vector<std::string> symbols;
-        std::string FullMemberName = archPath.get() + "(" + 
-          mbr->getPath().get() + ")";
+        std::string FullMemberName = archPath.toString() + "(" + 
+          mbr->getPath().toString() + ")";
         ModuleProvider* MP = GetBytecodeSymbols((const unsigned char*)At,
             mbr->getSize(), FullMemberName, symbols);
 
@@ -462,7 +462,7 @@
           modules.insert(std::make_pair(offset, std::make_pair(MP, mbr)));
         } else {
           throw std::string("Can't parse bytecode member: ") +
-            mbr->getPath().get();
+            mbr->getPath().toString();
         }
       }
 
diff --git a/lib/Bytecode/Archive/ArchiveWriter.cpp b/lib/Bytecode/Archive/ArchiveWriter.cpp
index 21be628..64c2567 100644
--- a/lib/Bytecode/Archive/ArchiveWriter.cpp
+++ b/lib/Bytecode/Archive/ArchiveWriter.cpp
@@ -94,7 +94,7 @@
   memcpy(hdr.date,buffer,12);
 
   // Get rid of trailing blanks in the name
-  std::string mbrPath = mbr.getPath().get();
+  std::string mbrPath = mbr.getPath().toString();
   size_t mbrLen = mbrPath.length();
   while (mbrLen > 0 && mbrPath[mbrLen-1] == ' ') {
     mbrPath.erase(mbrLen-1,1);
@@ -162,10 +162,10 @@
   mbr->path.getStatusInfo(mbr->info);
 
   unsigned flags = 0;
-  bool hasSlash = filePath.get().find('/') != std::string::npos;
+  bool hasSlash = filePath.toString().find('/') != std::string::npos;
   if (hasSlash)
     flags |= ArchiveMember::HasPathFlag;
-  if (hasSlash || filePath.get().length() > 15)
+  if (hasSlash || filePath.toString().length() > 15)
     flags |= ArchiveMember::HasLongFilenameFlag;
   std::string magic;
   mbr->path.getMagicNumber(magic,4);
@@ -212,7 +212,8 @@
   if (CreateSymbolTable && 
       (member.isBytecode() || member.isCompressedBytecode())) {
     std::vector<std::string> symbols;
-    std::string FullMemberName = archPath.get() + "(" + member.getPath().get() 
+    std::string FullMemberName = archPath.toString() + "(" + 
+      member.getPath().toString() 
       + ")";
     ModuleProvider* MP = GetBytecodeSymbols(
       (const unsigned char*)data,fSize,FullMemberName, symbols);
@@ -235,7 +236,7 @@
       delete MP;
     } else {
       throw std::string("Can't parse bytecode member: ") + 
-             member.getPath().get();
+             member.getPath().toString();
     }
   }
 
@@ -281,7 +282,8 @@
 
   // Write the long filename if its long
   if (writeLongName) {
-    ARFile.write(member.getPath().get().data(),member.getPath().get().length());
+    ARFile.write(member.getPath().toString().data(),
+                 member.getPath().toString().length());
   }
 
   // Make sure we write the compressed bytecode magic number if we should.
@@ -378,7 +380,7 @@
   
     // Check for errors opening or creating archive file.
     if ( !ArchiveFile.is_open() || ArchiveFile.bad() ) {
-      throw std::string("Error opening archive file: ") + archPath.get();
+      throw std::string("Error opening archive file: ") + archPath.toString();
     }
 
     // If we're creating a symbol table, reset it now
@@ -414,7 +416,7 @@
       // Open the final file to write and check it.
       std::ofstream FinalFile(archPath.c_str());
       if ( !FinalFile.is_open() || FinalFile.bad() ) {
-        throw std::string("Error opening archive file: ") + archPath.get();
+        throw std::string("Error opening archive file: ") + archPath.toString();
       }
 
       // Write the file magic number
diff --git a/lib/Bytecode/Reader/ReaderWrappers.cpp b/lib/Bytecode/Reader/ReaderWrappers.cpp
index b8c8b4a..fccbbe7 100644
--- a/lib/Bytecode/Reader/ReaderWrappers.cpp
+++ b/lib/Bytecode/Reader/ReaderWrappers.cpp
@@ -374,7 +374,8 @@
 bool llvm::GetBytecodeSymbols(const sys::Path& fName,
                               std::vector<std::string>& symbols) {
   try {
-    std::auto_ptr<ModuleProvider> AMP( getBytecodeModuleProvider(fName.get()));
+    std::auto_ptr<ModuleProvider> AMP( 
+        getBytecodeModuleProvider(fName.toString()));
 
     // Get the module from the provider
     Module* M = AMP->materializeModule();
