diff --git a/configure.ac b/configure.ac
index 906fb7c..f14095c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,9 +4,9 @@
AC_PREREQ([2.68])
AC_INIT(mosh, 0.9, mosh-devel@mit.edu)
AM_INIT_AUTOMAKE(mosh, 0.9)
-AC_CONFIG_SRCDIR([src/transportfragment.h])
+AC_CONFIG_SRCDIR([src/frontend/mosh-client.cc])
AC_CONFIG_HEADERS([config.h])
-AC_OUTPUT(Makefile src/Makefile src/protobufs/Makefile scripts/Makefile)
+AC_OUTPUT(Makefile src/Makefile src/crypto/Makefile src/frontend/Makefile src/network/Makefile src/protobufs/Makefile src/statesync/Makefile src/terminal/Makefile src/util/Makefile scripts/Makefile)
# Checks for programs.
AC_PROG_CXX
diff --git a/ocb-license.html b/ocb-license.html
new file mode 100644
index 0000000..707d968
--- /dev/null
+++ b/ocb-license.html
@@ -0,0 +1,38 @@
+
OCB - An Authenticated-Encryption Scheme - GPL Patent Grant - Rogaway
+
+
+
+
+Whereas I, Phillip Rogaway (hereinafter "Inventor") have sought
+patent protection for certain technology
+(hereinafter "Patented Technology"),
+and Inventor wishes to aid the Free Software Foundation in achieving its goals,
+and Inventor wishes to increase public awareness of Patented Technology,
+Inventor hereby grants a fully paid-up, nonexclusive,
+royalty-free license to
+practice any patents claiming priority to the
+patent applications below ("the Patents")
+if practiced by
+software distributed
+under the terms of any version of
+the GNU General Public License as published by the Free Software Foundation,
+59 Temple Place, Suite 330, Boston, MA 02111.
+Inventor reserves all other rights, including without limitation
+licensing for software not distributed under the GNU General Public License.
+
+The patents:
+
+
+
+-
+09/918,615 -
+Method and Apparatus for Facilitating Efficient Authenticated Encryption.
+
+
-
+09/948,084 -
+Method and Apparatus for Realizing a Parallelizable Variable-Input-Length
+Pseudorandom Function.
+
+
+
diff --git a/src/Makefile.am b/src/Makefile.am
index 533c2c0..409dac9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,14 +1 @@
-SUBDIRS = protobufs .
-
-AM_CPPFLAGS = -Iprotobufs -D_XOPEN_SOURCE=500 -D_GNU_SOURCE -D_BSD_SOURCE
-AM_CXXFLAGS = -g -O2 --std=c++0x -pedantic -Werror -Wall -Wextra -Weffc++ -fno-default-inline -pipe
-LIBS = `pkg-config --libs protobuf-lite`
-LDADD = -lutil -lrt -lm protobufs/libmoshprotos.a
-
-bin_PROGRAMS = mosh-client mosh-server
-
-source = ae.h base64.cc base64.h completeterminal.cc completeterminal.h crypto.cc crypto.h dos_assert.h network.cc network.h networktransport.cc networktransport.h ocb.cc parseraction.cc parseraction.h parser.cc parser.h parserstate.cc parserstatefamily.h parserstate.h parsertransition.h stmclient.cc stmclient.h swrite.cc swrite.h terminal.cc terminaldispatcher.cc terminaldispatcher.h terminaldisplay.cc terminaldisplay.h terminalframebuffer.cc terminalframebuffer.h terminalfunctions.cc terminal.h terminaloverlay.cc terminaloverlay.h terminaluserinput.cc terminaluserinput.h transportfragment.cc transportfragment.h transportsender.cc transportsender.h transportstate.h user.cc user.h rijndael-alg-fst.cc rijndael-alg-fst.h
-
-mosh_client_SOURCES = mosh-client.cc $(source)
-
-mosh_server_SOURCES = mosh-server.cc $(source)
+SUBDIRS = protobufs util crypto terminal network statesync frontend
diff --git a/src/crypto/Makefile.am b/src/crypto/Makefile.am
new file mode 100644
index 0000000..be203c4
--- /dev/null
+++ b/src/crypto/Makefile.am
@@ -0,0 +1,5 @@
+AM_CXXFLAGS = --std=c++0x -pedantic -Werror -Wall -Wextra -Weffc++ -fno-default-inline -pipe
+
+noinst_LIBRARIES = libmoshcrypto.a
+
+libmoshcrypto_a_SOURCES = ae.h base64.cc base64.h crypto.cc crypto.h ocb.cc rijndael-alg-fst.cc rijndael-alg-fst.h
\ No newline at end of file
diff --git a/src/ae.h b/src/crypto/ae.h
similarity index 100%
rename from src/ae.h
rename to src/crypto/ae.h
diff --git a/src/base64.cc b/src/crypto/base64.cc
similarity index 100%
rename from src/base64.cc
rename to src/crypto/base64.cc
diff --git a/src/base64.h b/src/crypto/base64.h
similarity index 100%
rename from src/base64.h
rename to src/crypto/base64.h
diff --git a/src/crypto.cc b/src/crypto/crypto.cc
similarity index 100%
rename from src/crypto.cc
rename to src/crypto/crypto.cc
diff --git a/src/crypto.h b/src/crypto/crypto.h
similarity index 100%
rename from src/crypto.h
rename to src/crypto/crypto.h
diff --git a/src/ocb.cc b/src/crypto/ocb.cc
similarity index 100%
rename from src/ocb.cc
rename to src/crypto/ocb.cc
diff --git a/src/rijndael-alg-fst.cc b/src/crypto/rijndael-alg-fst.cc
similarity index 100%
rename from src/rijndael-alg-fst.cc
rename to src/crypto/rijndael-alg-fst.cc
diff --git a/src/rijndael-alg-fst.h b/src/crypto/rijndael-alg-fst.h
similarity index 100%
rename from src/rijndael-alg-fst.h
rename to src/crypto/rijndael-alg-fst.h
diff --git a/src/frontend/Makefile.am b/src/frontend/Makefile.am
new file mode 100644
index 0000000..caec300
--- /dev/null
+++ b/src/frontend/Makefile.am
@@ -0,0 +1,9 @@
+AM_CPPFLAGS = -I$(srcdir)/../statesync -I$(srcdir)/../terminal -I$(srcdir)/../network -I$(srcdir)/../crypto -I$(builddir)/../protobufs -I$(srcdir)/../util
+AM_CXXFLAGS = --std=c++0x -pedantic -Werror -Wall -Wextra -Weffc++ -fno-default-inline -pipe
+LIBS = `pkg-config --libs protobuf-lite`
+LDADD = ../crypto/libmoshcrypto.a ../network/libmoshnetwork.a ../statesync/libmoshstatesync.a ../terminal/libmoshterminal.a ../util/libmoshutil.a ../protobufs/libmoshprotos.a -lutil -lrt -lm
+
+bin_PROGRAMS = mosh-client mosh-server
+
+mosh_client_SOURCES = mosh-client.cc stmclient.cc stmclient.h terminaloverlay.cc terminaloverlay.h
+mosh_server_SOURCES = mosh-server.cc
diff --git a/src/mosh-client.cc b/src/frontend/mosh-client.cc
similarity index 100%
rename from src/mosh-client.cc
rename to src/frontend/mosh-client.cc
diff --git a/src/mosh-server.cc b/src/frontend/mosh-server.cc
similarity index 100%
rename from src/mosh-server.cc
rename to src/frontend/mosh-server.cc
diff --git a/src/stmclient.cc b/src/frontend/stmclient.cc
similarity index 100%
rename from src/stmclient.cc
rename to src/frontend/stmclient.cc
diff --git a/src/stmclient.h b/src/frontend/stmclient.h
similarity index 100%
rename from src/stmclient.h
rename to src/frontend/stmclient.h
diff --git a/src/terminaloverlay.cc b/src/frontend/terminaloverlay.cc
similarity index 100%
rename from src/terminaloverlay.cc
rename to src/frontend/terminaloverlay.cc
diff --git a/src/terminaloverlay.h b/src/frontend/terminaloverlay.h
similarity index 100%
rename from src/terminaloverlay.h
rename to src/frontend/terminaloverlay.h
diff --git a/src/network/Makefile.am b/src/network/Makefile.am
new file mode 100644
index 0000000..0d80315
--- /dev/null
+++ b/src/network/Makefile.am
@@ -0,0 +1,6 @@
+AM_CPPFLAGS = -I$(srcdir)/../util -I$(srcdir)/../crypto -I$(builddir)/../protobufs
+AM_CXXFLAGS = --std=c++0x -pedantic -Werror -Wall -Wextra -Weffc++ -fno-default-inline -pipe
+
+noinst_LIBRARIES = libmoshnetwork.a
+
+libmoshnetwork_a_SOURCES = network.cc network.h networktransport.cc networktransport.h transportfragment.cc transportfragment.h transportsender.cc transportsender.h transportstate.h
diff --git a/src/network.cc b/src/network/network.cc
similarity index 100%
rename from src/network.cc
rename to src/network/network.cc
diff --git a/src/network.h b/src/network/network.h
similarity index 100%
rename from src/network.h
rename to src/network/network.h
diff --git a/src/networktransport.cc b/src/network/networktransport.cc
similarity index 100%
rename from src/networktransport.cc
rename to src/network/networktransport.cc
diff --git a/src/networktransport.h b/src/network/networktransport.h
similarity index 100%
rename from src/networktransport.h
rename to src/network/networktransport.h
diff --git a/src/transportfragment.cc b/src/network/transportfragment.cc
similarity index 100%
rename from src/transportfragment.cc
rename to src/network/transportfragment.cc
diff --git a/src/transportfragment.h b/src/network/transportfragment.h
similarity index 100%
rename from src/transportfragment.h
rename to src/network/transportfragment.h
diff --git a/src/transportsender.cc b/src/network/transportsender.cc
similarity index 100%
rename from src/transportsender.cc
rename to src/network/transportsender.cc
diff --git a/src/transportsender.h b/src/network/transportsender.h
similarity index 100%
rename from src/transportsender.h
rename to src/network/transportsender.h
diff --git a/src/transportstate.h b/src/network/transportstate.h
similarity index 100%
rename from src/transportstate.h
rename to src/network/transportstate.h
diff --git a/src/statesync/Makefile.am b/src/statesync/Makefile.am
new file mode 100644
index 0000000..b477bd4
--- /dev/null
+++ b/src/statesync/Makefile.am
@@ -0,0 +1,6 @@
+AM_CPPFLAGS = -I$(srcdir)/../terminal -I$(builddir)/../protobufs
+AM_CXXFLAGS = --std=c++0x -pedantic -Werror -Wall -Wextra -Weffc++ -fno-default-inline -pipe
+
+noinst_LIBRARIES = libmoshstatesync.a
+
+libmoshstatesync_a_SOURCES = completeterminal.cc completeterminal.h user.cc user.h
diff --git a/src/completeterminal.cc b/src/statesync/completeterminal.cc
similarity index 100%
rename from src/completeterminal.cc
rename to src/statesync/completeterminal.cc
diff --git a/src/completeterminal.h b/src/statesync/completeterminal.h
similarity index 100%
rename from src/completeterminal.h
rename to src/statesync/completeterminal.h
diff --git a/src/user.cc b/src/statesync/user.cc
similarity index 100%
rename from src/user.cc
rename to src/statesync/user.cc
diff --git a/src/user.h b/src/statesync/user.h
similarity index 100%
rename from src/user.h
rename to src/statesync/user.h
diff --git a/src/terminal/Makefile.am b/src/terminal/Makefile.am
new file mode 100644
index 0000000..cc3ec6a
--- /dev/null
+++ b/src/terminal/Makefile.am
@@ -0,0 +1,7 @@
+AM_CPPFLAGS = -I$(srcdir)/../util
+AM_CXXFLAGS = --std=c++0x -pedantic -Werror -Wall -Wextra -Weffc++ -fno-default-inline -pipe
+
+noinst_LIBRARIES = libmoshterminal.a
+
+libmoshterminal_a_SOURCES = parseraction.cc parseraction.h parser.cc parser.h parserstate.cc parserstatefamily.h parserstate.h parsertransition.h terminal.cc terminaldispatcher.cc terminaldispatcher.h terminaldisplay.cc terminaldisplay.h terminalframebuffer.cc terminalframebuffer.h terminalfunctions.cc terminal.h terminaluserinput.cc terminaluserinput.h
+
diff --git a/src/parser.cc b/src/terminal/parser.cc
similarity index 100%
rename from src/parser.cc
rename to src/terminal/parser.cc
diff --git a/src/parser.h b/src/terminal/parser.h
similarity index 100%
rename from src/parser.h
rename to src/terminal/parser.h
diff --git a/src/parseraction.cc b/src/terminal/parseraction.cc
similarity index 100%
rename from src/parseraction.cc
rename to src/terminal/parseraction.cc
diff --git a/src/parseraction.h b/src/terminal/parseraction.h
similarity index 100%
rename from src/parseraction.h
rename to src/terminal/parseraction.h
diff --git a/src/parserstate.cc b/src/terminal/parserstate.cc
similarity index 100%
rename from src/parserstate.cc
rename to src/terminal/parserstate.cc
diff --git a/src/parserstate.h b/src/terminal/parserstate.h
similarity index 100%
rename from src/parserstate.h
rename to src/terminal/parserstate.h
diff --git a/src/parserstatefamily.h b/src/terminal/parserstatefamily.h
similarity index 100%
rename from src/parserstatefamily.h
rename to src/terminal/parserstatefamily.h
diff --git a/src/parsertransition.h b/src/terminal/parsertransition.h
similarity index 100%
rename from src/parsertransition.h
rename to src/terminal/parsertransition.h
diff --git a/src/terminal.cc b/src/terminal/terminal.cc
similarity index 100%
rename from src/terminal.cc
rename to src/terminal/terminal.cc
diff --git a/src/terminal.h b/src/terminal/terminal.h
similarity index 100%
rename from src/terminal.h
rename to src/terminal/terminal.h
diff --git a/src/terminaldispatcher.cc b/src/terminal/terminaldispatcher.cc
similarity index 100%
rename from src/terminaldispatcher.cc
rename to src/terminal/terminaldispatcher.cc
diff --git a/src/terminaldispatcher.h b/src/terminal/terminaldispatcher.h
similarity index 100%
rename from src/terminaldispatcher.h
rename to src/terminal/terminaldispatcher.h
diff --git a/src/terminaldisplay.cc b/src/terminal/terminaldisplay.cc
similarity index 100%
rename from src/terminaldisplay.cc
rename to src/terminal/terminaldisplay.cc
diff --git a/src/terminaldisplay.h b/src/terminal/terminaldisplay.h
similarity index 100%
rename from src/terminaldisplay.h
rename to src/terminal/terminaldisplay.h
diff --git a/src/terminalframebuffer.cc b/src/terminal/terminalframebuffer.cc
similarity index 100%
rename from src/terminalframebuffer.cc
rename to src/terminal/terminalframebuffer.cc
diff --git a/src/terminalframebuffer.h b/src/terminal/terminalframebuffer.h
similarity index 100%
rename from src/terminalframebuffer.h
rename to src/terminal/terminalframebuffer.h
diff --git a/src/terminalfunctions.cc b/src/terminal/terminalfunctions.cc
similarity index 100%
rename from src/terminalfunctions.cc
rename to src/terminal/terminalfunctions.cc
diff --git a/src/terminaluserinput.cc b/src/terminal/terminaluserinput.cc
similarity index 100%
rename from src/terminaluserinput.cc
rename to src/terminal/terminaluserinput.cc
diff --git a/src/terminaluserinput.h b/src/terminal/terminaluserinput.h
similarity index 100%
rename from src/terminaluserinput.h
rename to src/terminal/terminaluserinput.h
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
new file mode 100644
index 0000000..14f02f9
--- /dev/null
+++ b/src/util/Makefile.am
@@ -0,0 +1,5 @@
+AM_CXXFLAGS = --std=c++0x -pedantic -Werror -Wall -Wextra -Weffc++ -fno-default-inline -pipe
+
+noinst_LIBRARIES = libmoshutil.a
+
+libmoshutil_a_SOURCES = swrite.cc swrite.h dos_assert.h
diff --git a/src/dos_assert.h b/src/util/dos_assert.h
similarity index 100%
rename from src/dos_assert.h
rename to src/util/dos_assert.h
diff --git a/src/swrite.cc b/src/util/swrite.cc
similarity index 100%
rename from src/swrite.cc
rename to src/util/swrite.cc
diff --git a/src/swrite.h b/src/util/swrite.h
similarity index 100%
rename from src/swrite.h
rename to src/util/swrite.h