diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Imports_uriAsEnteredByUser_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Imports_uriAsEnteredByUser_Test.java
new file mode 100644
index 0000000..0b31fc6
--- /dev/null
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Imports_uriAsEnteredByUser_Test.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2012 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.model.util;
+
+import static com.google.eclipse.protobuf.junit.core.IntegrationTestModule.integrationTestModule;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
+import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+
+/**
+ * Tests for <code>{@link Imports#uriAsEnteredByUser(Import)}</code>
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Imports_uriAsEnteredByUser_Test {
+  @Rule public XtextRule xtext = overrideRuntimeModuleWith(integrationTestModule());
+
+  private Imports imports;
+
+  @Before public void setUp() {
+    imports = xtext.getInstanceOf(Imports.class);
+  }
+
+  // syntax = "proto2";
+  // import "types.proto";
+  @Test public void should_return_import_URI_as_entered_by_user() {
+    Protobuf root = xtext.root();
+    Import anImport = firstImportOf(root);
+    anImport.setImportURI("file://test-protos/types.proto"); // simulate the URI is resolved
+    assertThat(imports.uriAsEnteredByUser(anImport), equalTo("types.proto"));
+  }
+
+  private Import firstImportOf(Protobuf root) {
+    List<Import> allImports = getAllContentsOfType(root, Import.class);
+    return allImports.get(0);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
index ea34dc1..5e0429e 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
@@ -19,9 +19,9 @@
 import org.eclipse.xtext.ui.editor.model.IXtextDocument;
 import org.eclipse.xtext.util.concurrent.IUnitOfWork;
 
+import com.google.eclipse.protobuf.model.util.Imports;
 import com.google.eclipse.protobuf.protobuf.Import;
 import com.google.eclipse.protobuf.ui.editor.FileOpener;
-import com.google.eclipse.protobuf.ui.util.Imports;
 import com.google.inject.Inject;
 
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Imports.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Imports.java
deleted file mode 100644
index 0debb18..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Imports.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2012 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
- * Public License v1.0 which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.ui.util;
-
-import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
-
-import org.eclipse.xtext.nodemodel.INode;
-
-import com.google.eclipse.protobuf.conversion.STRINGValueConverter;
-import com.google.eclipse.protobuf.model.util.INodes;
-import com.google.eclipse.protobuf.protobuf.Import;
-import com.google.inject.Inject;
-
-/**
- * Utility methods related to <code>{@link Import}</code>s.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class Imports {
-  @Inject private INodes nodes;
-  @Inject private STRINGValueConverter stringValueConverter;
-
-  public String uriAsEnteredByUser(Import anImport) {
-    INode node = nodes.firstNodeForFeature(anImport, IMPORT__IMPORT_URI);
-    if (node == null) {
-      return null;
-    }
-    String text = node.getText();
-    if (text == null) {
-      return null;
-    }
-    return stringValueConverter.toValue(text, node);
-
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
index 74a81c8..179d527 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
@@ -21,9 +21,9 @@
 import org.eclipse.xtext.ui.editor.model.*;
 import org.eclipse.xtext.util.concurrent.IUnitOfWork;
 
+import com.google.eclipse.protobuf.model.util.Imports;
 import com.google.eclipse.protobuf.protobuf.Import;
 import com.google.eclipse.protobuf.ui.ProtobufPlugIn;
-import com.google.eclipse.protobuf.ui.util.Imports;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/STRINGValueConverter.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/STRINGValueConverter.java
index 13a3093..a1a64a2 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/STRINGValueConverter.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/STRINGValueConverter.java
@@ -8,10 +8,8 @@
  */
 package com.google.eclipse.protobuf.conversion;
 
-import static java.util.regex.Pattern.compile;
-import static org.eclipse.xtext.util.Strings.*;
-
-import java.util.regex.Pattern;
+import static com.google.eclipse.protobuf.util.Strings.*;
+import static org.eclipse.xtext.util.Strings.convertToJavaString;
 
 import org.eclipse.xtext.conversion.ValueConverterException;
 import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter;
@@ -23,17 +21,16 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class STRINGValueConverter extends AbstractLexerBasedConverter<String> {
-  private static final Pattern LINE_BREAK = compile("\"[\t\r\n]+\"|'[\t\r\n]+'");
-
   @Override protected String toEscapedString(String value) {
     if (value == null) {
       return null;
     }
+    // TODO check if we really need to quote
     return '"' + convertToJavaString(removeLineBreaksFrom(value), false) + '"';
   }
 
   /**
-   * Creates a {@code String} from the given input, if the given input represents a multi-line string.
+   * Creates a {@code String} from the given input, if the given input represents a multiple-line string.
    * @param string the given input.
    * @param node the parsed node including hidden parts.
    * @return the new integer.
@@ -44,20 +41,12 @@
       return null;
     }
     try {
-      String clean = removeLineBreaksFrom(string).trim();
-      return convertToJavaString(clean.substring(1, clean.length() - 1), true);
+      return convertToJavaString(unquote(removeLineBreaksFrom(string).trim()), true);
     } catch (IllegalArgumentException e) {
       throw parsingError(string, node, e);
     }
   }
 
-  private static String removeLineBreaksFrom(String s) {
-    if (isEmpty(s)) {
-      return s;
-    }
-    return LINE_BREAK.matcher(s).replaceAll("");
-  }
-
   private ValueConverterException parsingError(String string, INode node, Exception cause) {
     return new ValueConverterException("Couldn't convert '" + string + "' to String.", node, cause);
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
index bd08c14..deaef4c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
@@ -8,25 +8,31 @@
  */
 package com.google.eclipse.protobuf.model.util;
 
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
+import static com.google.eclipse.protobuf.util.Strings.*;
+import static org.eclipse.xtext.util.Strings.convertToJavaString;
+
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.xtext.nodemodel.INode;
 
 import com.google.eclipse.protobuf.protobuf.Import;
 import com.google.eclipse.protobuf.scoping.ProtoDescriptorProvider;
-import com.google.inject.*;
+import com.google.inject.Inject;
 
 /**
  * Utility methods related to imports.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-@Singleton public class Imports {
+public class Imports {
   @Inject private ProtoDescriptorProvider descriptorProvider;
+  @Inject private INodes nodes;
 
   /**
-   * Indicates whether the URI of the given import is equal to the path of descriptor.proto
-   * ("google/protobuf/descriptor.proto").
-   * @param anImport the import to check.
-   * @return {@code true} if the URI of the given import is equal to the path of descriptor.proto, {@code false}
+   * Indicates whether the URI of the given {@code Import} is equal to the path of the file "descriptor.proto."
+   * @param anImport the {@code Import} to check.
+   * @return {@code true} if the URI of the given {@code Import} is equal to the path of the file "descriptor.proto,"
+   * {@code false}
    * otherwise.
    */
   public boolean hasUnresolvedDescriptorUri(Import anImport) {
@@ -37,9 +43,9 @@
   }
 
   /**
-   * Indicates whether the given <code>{@link Import}</code> is pointing to descriptor.proto.
-   * @param anImport the given import to check.
-   * @return {@code true} if the given import is pointing to descriptor.proto, {@code false} otherwise.
+   * Indicates whether the given {@code Import} is pointing to descriptor.proto.
+   * @param anImport the given {@code Import} to check.
+   * @return {@code true} if the given {@code Import} is pointing to descriptor.proto, {@code false} otherwise.
    */
   public boolean isImportingDescriptor(Import anImport) {
     if (hasUnresolvedDescriptorUri(anImport)) {
@@ -57,4 +63,21 @@
     }
     return false;
   }
-}
+
+  /**
+   * Returns the URI of the given {@code Import} as it looks in the editor (i.e. before it is resolved.)
+   * @param anImport the given {@code Import}.
+   * @return the URI of the given {@code Import} as it looks in the editor.
+   */
+  public String uriAsEnteredByUser(Import anImport) {
+    INode node = nodes.firstNodeForFeature(anImport, IMPORT__IMPORT_URI);
+    if (node == null) {
+      return null;
+    }
+    String text = node.getText();
+    if (text == null) {
+      return null;
+    }
+    return convertToJavaString(unquote(removeLineBreaksFrom(text).trim()), true);
+  }
+ }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Strings.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Strings.java
index 59867db..bcaf5fa 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Strings.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Strings.java
@@ -8,16 +8,24 @@
  */
 package com.google.eclipse.protobuf.util;
 
+import static java.util.regex.Pattern.compile;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import java.util.regex.Pattern;
+
 /**
  * Utility methods related to {@code String}.s
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
 public final class Strings {
+  private static final Pattern LINE_BREAK = compile("\"[\t\r\n]+\"|'[\t\r\n]+'");
+
   /**
-   * Returns the given {@code String} in double quotes.
+   * Returns a {@code String} containing the given one in double quotes.
    * @param s the given {@code String}, may be {@code null}.
-   * @return the given {@code String} in double quotes, or {@code null} if the given {@code String} is {@code null}.
+   * @return a {@code String} containing the given one in double quotes, or {@code null} if the given {@code String} is
+   * {@code null}.
    */
   public static String quote(String s) {
     if (s == null) {
@@ -26,5 +34,37 @@
     return "\"" + s + "\"";
   }
 
+  /**
+   * Removes surrounding quotes from the given {@code String}.
+   * @param s the given {@code String}, may be {@code null}.
+   * @return a {@code String} containing the given one without surrounding quotes, or {@code null} if the given
+   * {@code String} is {@code null}.
+   */
+  public static String unquote(String s) {
+    if (!isQuoted(s)) {
+      return s;
+    }
+    return s.substring(1, s.length() - 1);
+  }
+
+  private static boolean isQuoted(String s) {
+    if (isEmpty(s)) {
+      return false;
+    }
+    return (s.startsWith("\"") && s.endsWith("\"")) || (s.startsWith("'") && s.endsWith("'"));
+  }
+
+  /**
+   * Returns a {@code String} containing the given one without line breaks.
+   * @param s the given {@code String}, may be {@code null}.
+   * @return a {@code String} containing the given one without line breaks, or {@code null} if the given {@code String}
+   * is {@code null}.
+   */
+  public static String removeLineBreaksFrom(String s) {
+    if (isEmpty(s)) {
+      return s;
+    }
+    return LINE_BREAK.matcher(s).replaceAll("");
+  }
   private Strings() {}
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
index 4f06f51..916a911 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
@@ -41,8 +41,8 @@
   @Override public void register(EValidatorRegistrar registrar) {}
 
   /**
-   * Verifies that "imports" in the given root only refer to "proto2" files. If non-proto2 "imports" are found, this
-   * validator creates warning markers for such "imports".
+   * Verifies that {@code Import}s in the given root only refer to "proto2" files. If non-proto2 {@code Import}s are
+   * found, this validator will create warning markers for such "imports".
    * @param root the root containing the imports to check.
    */
   @Check public void checkNonProto2Imports(Protobuf root) {
@@ -109,9 +109,9 @@
   }
 
   /**
-   * Verifies that the URI of the given "import" has been resolved. If the URI has not been resolved, the validator
-   * creates an error marker for the given "import."
-   * @param anImport the given "import."
+   * Verifies that the URI of the given {@code Import} has been resolved. If the URI has not been resolved, this
+   * validator will create an error marker for the given {@code Import}.
+   * @param anImport the given {@code Import}.
    */
   @Check public void checkUriIsResolved(Import anImport) {
     if (isResolved(anImport)) {
