diff --git a/src/surfMesh/Make/files b/src/surfMesh/Make/files
index a62f9c27f9..3b63a621ae 100644
--- a/src/surfMesh/Make/files
+++ b/src/surfMesh/Make/files
@@ -26,6 +26,7 @@ $(surfaceFormats)/ftr/FTRsurfaceFormatRunTime.C
$(surfaceFormats)/gts/GTSsurfaceFormatRunTime.C
$(surfaceFormats)/nas/NASsurfaceFormatRunTime.C
$(surfaceFormats)/obj/OBJsurfaceFormatRunTime.C
+$(surfaceFormats)/obj/OBJstream.C
$(surfaceFormats)/off/OFFsurfaceFormatRunTime.C
$(surfaceFormats)/ofs/OFSsurfaceFormatCore.C
$(surfaceFormats)/ofs/OFSsurfaceFormatRunTime.C
diff --git a/src/surfMesh/surfaceFormats/obj/OBJstream.C b/src/surfMesh/surfaceFormats/obj/OBJstream.C
new file mode 100644
index 0000000000..ca24b6b6aa
--- /dev/null
+++ b/src/surfMesh/surfaceFormats/obj/OBJstream.C
@@ -0,0 +1,323 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "OBJstream.H"
+//#include "token.H"
+#include "primitivePatch.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(Foam::OBJstream, 0);
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+void Foam::OBJstream::writeAndCheck(const char c)
+{
+ if (c == '\n')
+ {
+ startOfLine_ = true;
+ }
+ else if (startOfLine_)
+ {
+ startOfLine_ = false;
+ if (c == 'v')
+ {
+ nVertices_++;
+ }
+ }
+ OFstream::write(c);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::OBJstream::OBJstream
+(
+ const fileName& pathname,
+ streamFormat format,
+ versionNumber version,
+ compressionType compression
+)
+:
+ OFstream(pathname, format, version, compression),
+ startOfLine_(true),
+ nVertices_(0)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::OBJstream::~OBJstream()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::Ostream& Foam::OBJstream::write(const char c)
+{
+ writeAndCheck(c);
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write(const char* str)
+{
+ for (const char* p = str; *p != '\0'; ++p)
+ {
+ writeAndCheck(*p);
+ }
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write(const word& str)
+{
+ write(str.c_str());
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write(const string& str)
+{
+ OFstream::write(token::BEGIN_STRING);
+
+ register int backslash = 0;
+ for (string::const_iterator iter = str.begin(); iter != str.end(); ++iter)
+ {
+ register char c = *iter;
+
+ if (c == '\\')
+ {
+ backslash++;
+ // suppress output until we know if other characters follow
+ continue;
+ }
+ else if (c == token::NL)
+ {
+ lineNumber_++;
+ backslash++; // backslash escape for newline
+ }
+ else if (c == token::END_STRING)
+ {
+ backslash++; // backslash escape for quote
+ }
+
+ // output pending backslashes
+ while (backslash)
+ {
+ OFstream::write('\\');
+ backslash--;
+ }
+
+ writeAndCheck(c);
+ }
+
+ // silently drop any trailing backslashes
+ // they would otherwise appear like an escaped end-quote
+
+ OFstream::write(token::END_STRING);
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::writeQuoted
+(
+ const std::string& str,
+ const bool quoted
+)
+{
+ if (quoted)
+ {
+ OFstream::write(token::BEGIN_STRING);
+
+ register int backslash = 0;
+ for
+ (
+ string::const_iterator iter = str.begin();
+ iter != str.end();
+ ++iter
+ )
+ {
+ register char c = *iter;
+
+ if (c == '\\')
+ {
+ backslash++;
+ // suppress output until we know if other characters follow
+ continue;
+ }
+ else if (c == token::NL)
+ {
+ lineNumber_++;
+ backslash++; // backslash escape for newline
+ }
+ else if (c == token::END_STRING)
+ {
+ backslash++; // backslash escape for quote
+ }
+
+ // output pending backslashes
+ while (backslash)
+ {
+ OFstream::write('\\');
+ backslash--;
+ }
+
+ writeAndCheck(c);
+ }
+
+ // silently drop any trailing backslashes
+ // they would otherwise appear like an escaped end-quote
+ OFstream::write(token::END_STRING);
+ }
+ else
+ {
+ // output unquoted string, only advance line number on newline
+ write(str.c_str());
+ }
+
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write(const point& pt)
+{
+ write("v ") << pt.x() << ' ' << pt.y() << ' ' << pt.z()
+ << nl;
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write(const point& pt, const vector& n)
+{
+ write(pt);
+ OFstream::write("vn ") << n.x() << ' ' << n.y()
+ << ' ' << n.z() << nl;
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write(const edge& e, const pointField& points)
+{
+ write(points[e[0]]);
+ write(points[e[1]]);
+ write("l ") << nVertices_-1 << ' ' << nVertices_ << nl;
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write(const linePointRef& ln)
+{
+ write(ln.start());
+ write(ln.end());
+ write("l ") << nVertices_-1 << ' ' << nVertices_ << nl;
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write
+(
+ const face& f,
+ const pointField& points,
+ const bool lines
+)
+{
+ label start = nVertices_;
+ forAll(f, i)
+ {
+ write(points[f[i]]);
+ }
+ if (lines)
+ {
+ write('l');
+ forAll(f, i)
+ {
+ write(' ') << start+1+i;
+ }
+ write(' ') << start+1 << '\n';
+ }
+ else
+ {
+ write('f');
+ forAll(f, i)
+ {
+ write(' ') << start+1+i;
+ }
+ write('\n');
+ }
+ return *this;
+}
+
+
+Foam::Ostream& Foam::OBJstream::write
+(
+ const faceList& fcs,
+ const pointField& points,
+ const bool lines
+)
+{
+ SubList allFcs(fcs, fcs.size());
+
+ primitivePatch pp(allFcs, points);
+
+ const pointField& localPoints = pp.localPoints();
+ const faceList& localFaces = pp.localFaces();
+
+ label start = nVertices_;
+
+ forAll(localPoints, i)
+ {
+ write(localPoints[i]);
+ }
+
+ if (lines)
+ {
+ const edgeList& edges = pp.edges();
+ forAll(edges, edgeI)
+ {
+ const edge& e = edges[edgeI];
+
+ write("l ") << start+e[0]+1 << ' ' << start+e[1]+1 << nl;
+ }
+ }
+ else
+ {
+ forAll(localFaces, faceI)
+ {
+ const face& f = localFaces[faceI];
+ write('f');
+ forAll(f, i)
+ {
+ write(' ') << start+f[i]+1;
+ }
+ write('\n');
+ }
+ }
+ return *this;
+}
+
+
+// ************************************************************************* //
diff --git a/src/surfMesh/surfaceFormats/obj/OBJstream.H b/src/surfMesh/surfaceFormats/obj/OBJstream.H
new file mode 100644
index 0000000000..9e62cbdbeb
--- /dev/null
+++ b/src/surfMesh/surfaceFormats/obj/OBJstream.H
@@ -0,0 +1,164 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+Class
+ Foam::OBJstream
+
+Description
+ OFstream which keeps track of vertices
+
+SourceFiles
+ OBJstream.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef OBJstream_H
+#define OBJstream_H
+
+#include "OFstream.H"
+#include "point.H"
+#include "edge.H"
+#include "face.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+
+/*---------------------------------------------------------------------------*\
+ Class OBJstream Declaration
+\*---------------------------------------------------------------------------*/
+
+class OBJstream
+:
+ public OFstream
+{
+ // Private data
+
+ bool startOfLine_;
+
+ label nVertices_;
+
+
+ // Private Member Functions
+
+ void writeAndCheck(const char);
+
+public:
+
+ // Declare name of the class and its debug switch
+ ClassName("OBJstream");
+
+
+ // Constructors
+
+ //- Construct from pathname
+ OBJstream
+ (
+ const fileName& pathname,
+ streamFormat format=ASCII,
+ versionNumber version=currentVersion,
+ compressionType compression=UNCOMPRESSED
+ );
+
+
+ //- Destructor
+ ~OBJstream();
+
+
+ // Member functions
+
+ // Access
+
+ //- Return the name of the stream
+ label nVertices() const
+ {
+ return nVertices_;
+ }
+
+
+ // Ostream implementation
+
+ //- Write character
+ virtual Ostream& write(const char);
+
+ //- Write character string
+ virtual Ostream& write(const char*);
+
+ //- Write word
+ virtual Ostream& write(const word&);
+
+ virtual Ostream& write(const string&);
+
+ //- Write std::string surrounded by quotes.
+ // Optional write without quotes.
+ virtual Ostream& writeQuoted
+ (
+ const std::string&,
+ const bool quoted=true
+ );
+
+
+ // Direct write functionality
+
+ //- Write point
+ Ostream& write(const point&);
+
+ //- Write point and vector normal ('vn')
+ Ostream& write(const point&, const vector&);
+
+ //- Write edge as points with line
+ Ostream& write(const edge&, const pointField&);
+
+ //- Write line
+ Ostream& write(const linePointRef&);
+
+ //- Write face as points with lines or filled polygon
+ Ostream& write
+ (
+ const face&,
+ const pointField&,
+ const bool lines = true
+ );
+
+ //- Write patch as points and faces with lines or filled polygons
+ Ostream& write
+ (
+ const faceList&,
+ const pointField&,
+ const bool lines = true
+ );
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //