diff --git a/gm/factory.cpp b/gm/factory.cpp
index a7356a9..4538cda 100644
--- a/gm/factory.cpp
+++ b/gm/factory.cpp
@@ -11,7 +11,6 @@
 #include "SkData.h"
 #include "SkImageDecoder.h"
 #include "SkLruImageCache.h"
-#include "SkOSFile.h"
 #include "SkStream.h"
 
 namespace skiagm {
@@ -25,9 +24,13 @@
 
 protected:
     virtual void onOnceBeforeDraw() SK_OVERRIDE {
+        SkString filename(INHERITED::gResourcePath);
+        if (!filename.endsWith("/") && !filename.endsWith("\\")) {
+            filename.append("/");
+        }
+
         // Copyright-free file from http://openclipart.org/detail/29213/paper-plane-by-ddoo
-        SkString filename = SkOSPath::SkPathJoin(INHERITED::gResourcePath.c_str(),
-                                                 "plane.png");
+        filename.append("plane.png");
 
         SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(filename.c_str()));
         if (NULL != stream.get()) {
diff --git a/gm/gm_expectations.cpp b/gm/gm_expectations.cpp
index 46cfea1..8138af7 100644
--- a/gm/gm_expectations.cpp
+++ b/gm/gm_expectations.cpp
@@ -37,6 +37,15 @@
         va_end(args);
     }
 
+    SkString SkPathJoin(const char *rootPath, const char *relativePath) {
+        SkString result(rootPath);
+        if (!result.endsWith(SkPATH_SEPARATOR)) {
+            result.appendUnichar(SkPATH_SEPARATOR);
+        }
+        result.append(relativePath);
+        return result;
+    }
+
     Json::Value CreateJsonTree(Json::Value expectedResults,
                                Json::Value actualResultsFailed,
                                Json::Value actualResultsFailureIgnored,
@@ -185,7 +194,7 @@
     // IndividualImageExpectationsSource class...
 
     Expectations IndividualImageExpectationsSource::get(const char *testName) {
-        SkString path = SkOSPath::SkPathJoin(fRootDir.c_str(), testName);
+        SkString path = SkPathJoin(fRootDir.c_str(), testName);
         SkBitmap referenceBitmap;
         bool decodedReferenceBitmap =
             SkImageDecoder::DecodeFile(path.c_str(), &referenceBitmap,
diff --git a/gm/gm_expectations.h b/gm/gm_expectations.h
index 55122d4..8efb986 100644
--- a/gm/gm_expectations.h
+++ b/gm/gm_expectations.h
@@ -32,6 +32,16 @@
 
     void gm_fprintf(FILE *stream, const char format[], ...);
 
+    /**
+     * Assembles rootPath and relativePath into a single path, like this:
+     * rootPath/relativePath
+     *
+     * Uses SkPATH_SEPARATOR, to work on all platforms.
+     *
+     * TODO(epoger): This should probably move into SkOSFile.h
+     */
+    SkString SkPathJoin(const char *rootPath, const char *relativePath);
+
     Json::Value CreateJsonTree(Json::Value expectedResults,
                                Json::Value actualResultsFailed,
                                Json::Value actualResultsFailureIgnored,
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 3c4f27d..3481cf8 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -222,7 +222,7 @@
         filename.append(renderModeDescriptor);
         filename.appendUnichar('.');
         filename.append(suffix);
-        return SkOSPath::SkPathJoin(path, filename.c_str());
+        return SkPathJoin(path, filename.c_str());
     }
 
     /* since PNG insists on unpremultiplying our alpha, we take no
diff --git a/gm/image.cpp b/gm/image.cpp
index 71fe0e1..8578e51 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -31,9 +31,6 @@
 }
 
 static void drawJpeg(SkCanvas* canvas, const SkISize& size) {
-    // TODO: Make this draw a file that is checked in, so it can
-    // be exercised on machines other than mike's. Will require a
-    // rebaseline.
     SkAutoDataUnref data(fileToData("/Users/mike/Downloads/skia.google.jpeg"));
     SkImage* image = SkImage::NewEncodedData(data);
     if (image) {
diff --git a/gyp/tests.gyp b/gyp/tests.gyp
index 10a4ba4..a15671d 100644
--- a/gyp/tests.gyp
+++ b/gyp/tests.gyp
@@ -75,7 +75,6 @@
         '../tests/Matrix44Test.cpp',
         '../tests/MemsetTest.cpp',
         '../tests/MetaDataTest.cpp',
-        '../tests/OSPathTest.cpp',
         '../tests/PackBitsTest.cpp',
         '../tests/PaintTest.cpp',
         '../tests/ParsePathTest.cpp',
diff --git a/include/core/SkOSFile.h b/include/core/SkOSFile.h
index 8564d43..257b66a 100644
--- a/include/core/SkOSFile.h
+++ b/include/core/SkOSFile.h
@@ -105,27 +105,4 @@
     uint16_t*   fStr;
 };
 
-/**
- *  Functions for modifying SkStrings which represent paths on the filesystem.
- */
-class SkOSPath {
-public:
-    /**
-     * Assembles rootPath and relativePath into a single path, like this:
-     * rootPath/relativePath
-     *
-     * Uses SkPATH_SEPARATOR, to work on all platforms.
-     */
-    static SkString SkPathJoin(const char *rootPath, const char *relativePath);
-
-    /**
-     *  Return the name of the file, ignoring the directory structure.
-     *  Behaves like python's os.path.basename. If the fullPath is
-     *  /dir/subdir/, an empty string is returned.
-     *  @param fullPath Full path to the file.
-     *  @return SkString The basename of the file - anything beyond the
-     *      final slash, or the full name if there is no slash.
-     */
-    static SkString SkBasename(const char* fullPath);
-};
 #endif
diff --git a/src/utils/SkOSFile.cpp b/src/utils/SkOSFile.cpp
index 73cc147..478a0cc 100644
--- a/src/utils/SkOSFile.cpp
+++ b/src/utils/SkOSFile.cpp
@@ -226,25 +226,4 @@
     return false;
 }
 
-SkString SkOSPath::SkPathJoin(const char *rootPath, const char *relativePath) {
-    SkString result(rootPath);
-    if (!result.endsWith(SkPATH_SEPARATOR)) {
-        result.appendUnichar(SkPATH_SEPARATOR);
-    }
-    result.append(relativePath);
-    return result;
-}
-
-SkString SkOSPath::SkBasename(const char* fullPath) {
-    if (!fullPath) {
-        return SkString();
-    }
-    const char* filename = strrchr(fullPath, SkPATH_SEPARATOR);
-    if (NULL == filename) {
-        filename = fullPath;
-    } else {
-        ++filename;
-    }
-    return SkString(filename);
-}
 #endif
diff --git a/tests/OSPathTest.cpp b/tests/OSPathTest.cpp
deleted file mode 100644
index 96ff8a7..0000000
--- a/tests/OSPathTest.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkString.h"
-#include "SkOSFile.h"
-#include "Test.h"
-
-/**
- *  Test SkPathJoin and SkBasename.
- *  Will use SkPathJoin to append filename to dir, test that it works correctly,
- *  and tests using SkBasename on the result.
- *  @param reporter Reporter for test conditions.
- *  @param dir String representing the path to a folder. May or may not
- *      end with SkPATH_SEPARATOR.
- *  @param filename String representing the basename of a file. Must NOT
- *      contain SkPATH_SEPARATOR.
- */
-static void test_dir_with_file(skiatest::Reporter* reporter, SkString dir,
-                               SkString filename) {
-    // If filename contains SkPATH_SEPARATOR, the tests will fail.
-    SkASSERT(!filename.contains(SkPATH_SEPARATOR));
-
-    // Tests for SkOSPath::SkPathJoin and SkOSPath::SkBasename
-
-    // fullName should be "dir<SkPATH_SEPARATOR>file"
-    SkString fullName = SkOSPath::SkPathJoin(dir.c_str(), filename.c_str());
-
-    // fullName should be the combined size of dir and file, plus one if
-    // dir did not include the final path separator.
-    size_t expectedSize = dir.size() + filename.size();
-    if (!dir.endsWith(SkPATH_SEPARATOR)) {
-        expectedSize++;
-    }
-    REPORTER_ASSERT(reporter, fullName.size() == expectedSize);
-
-    SkString basename = SkOSPath::SkBasename(fullName.c_str());
-
-    // basename should be the same as filename
-    REPORTER_ASSERT(reporter, basename.equals(filename));
-
-    // basename will not contain a path separator
-    REPORTER_ASSERT(reporter, !basename.contains(SkPATH_SEPARATOR));
-
-    // Now take the basename of filename, which should be the same as filename.
-    basename = SkOSPath::SkBasename(filename.c_str());
-    REPORTER_ASSERT(reporter, basename.equals(filename));
-}
-
-static void test_os_path_utils_tests(skiatest::Reporter* reporter) {
-    SkString dir("dir");
-    SkString filename("file");
-    test_dir_with_file(reporter, dir, filename);
-
-    // Now make sure this works with a path separator at the end of dir.
-    dir.appendUnichar(SkPATH_SEPARATOR);
-    test_dir_with_file(reporter, dir, filename);
-
-    // Test with a sub directory.
-    dir.append("subDir");
-    test_dir_with_file(reporter, dir, filename);
-
-    // Basename of a directory with a path separator at the end is empty.
-    dir.appendUnichar(SkPATH_SEPARATOR);
-    SkString baseOfDir = SkOSPath::SkBasename(dir.c_str());
-    REPORTER_ASSERT(reporter, baseOfDir.size() == 0);
-
-    // Basename of NULL is an empty string.
-    SkString empty = SkOSPath::SkBasename(NULL);
-    REPORTER_ASSERT(reporter, empty.size() == 0);
-}
-
-#include "TestClassDef.h"
-DEFINE_TESTCLASS("OSPath", OSPathTestClass, test_os_path_utils_tests)
diff --git a/tools/skimage_main.cpp b/tools/skimage_main.cpp
index 98cde50..f52cf32 100644
--- a/tools/skimage_main.cpp
+++ b/tools/skimage_main.cpp
@@ -69,10 +69,27 @@
     return SkImageDecoder::kUnknown_Format;
 }
 
+/**
+ *  Return the name of the file, ignoring the directory structure.
+ *  Does not create a new string.
+ *  @param fullPath Full path to the file.
+ *  @return string The basename of the file - anything beyond the final slash, or the full name
+ *      if there is no slash.
+ *  TODO: Might this be useful as a utility function in SkOSFile? Would it be more appropriate to
+ *  create a new string?
+ */
+static const char* SkBasename(const char* fullPath) {
+    const char* filename = strrchr(fullPath, SkPATH_SEPARATOR);
+    if (NULL == filename || *++filename == '\0') {
+        filename = fullPath;
+    }
+    return filename;
+}
+
 static void make_outname(SkString* dst, const char outDir[], const char src[],
                          const char suffix[]) {
-    SkString basename = SkOSPath::SkBasename(src);
-    dst->set(SkOSPath::SkPathJoin(outDir, basename.c_str()));
+    const char* basename = SkBasename(src);
+    dst->set(skiagm::SkPathJoin(outDir, basename));
     if (!dst->endsWith(suffix)) {
         const char* cstyleDst = dst->c_str();
         const char* dot = strrchr(cstyleDst, '.');
@@ -255,7 +272,8 @@
     SkASSERT(bitmapFromDecodeSubset != NULL);
 
     // Create a subdirectory to hold the results of decodeSubset.
-    SkString dir = SkOSPath::SkPathJoin(writePath, "subsets");
+    // TODO: Move SkPathJoin into SkOSFile.h
+    SkString dir = skiagm::SkPathJoin(writePath, "subsets");
     if (!sk_mkdir(dir.c_str())) {
         gFailedSubsetDecodes.push_back().printf("Successfully decoded %s from %s, but failed to "
                                                 "create a directory to write to.", subsetDim,
@@ -280,7 +298,7 @@
         return false;
     }
 
-    SkString dirExtracted = SkOSPath::SkPathJoin(writePath, "extracted");
+    SkString dirExtracted = skiagm::SkPathJoin(writePath, "extracted");
     if (!sk_mkdir(dirExtracted.c_str())) {
         gFailedSubsetDecodes.push_back().printf("Successfully decoded %s from %s, but failed to "
                                                 "create a directory for extractSubset comparison.",
@@ -317,8 +335,7 @@
     }
 
     // Create a string representing just the filename itself, for use in json expectations.
-    SkString basename = SkOSPath::SkBasename(srcPath);
-    const char* filename = basename.c_str();
+    const char* filename = SkBasename(srcPath);
 
     if (compare_to_expectations_if_necessary(bitmap, filename, &gDecodeFailures)) {
         gSuccessfulDecodes.push_back().printf("%s [%d %d]", srcPath, bitmap.width(),
