diff --git a/update/build/unix/Makefile b/update/build/unix/Makefile
new file mode 100644
index 00000000..3b50301c
--- /dev/null
+++ b/update/build/unix/Makefile
@@ -0,0 +1,12 @@
+all: debug
+
+debug:
+ @+make -f debug.mk all
+
+release:
+ @+make -f release.mk all
+
+clean:
+ @+make -f build.mk clean
+
+.PHONY: all clean debug release
diff --git a/update/build/unix/build.mk b/update/build/unix/build.mk
new file mode 100644
index 00000000..b51f18dc
--- /dev/null
+++ b/update/build/unix/build.mk
@@ -0,0 +1,55 @@
+CFLAGS +=
+CXXFLAGS := $(CFLAGS) -std=gnu++17
+DEFINES += -DTRACY_NO_STATISTICS
+INCLUDES :=
+LIBS := -lpthread
+PROJECT := update
+IMAGE := $(PROJECT)-$(BUILD)
+
+FILTER :=
+
+BASE := $(shell egrep 'ClCompile.*cpp"' ../win32/$(PROJECT).vcxproj | sed -e 's/.*\"\(.*\)\".*/\1/' | sed -e 's@\\@/@g')
+BASE2 := $(shell egrep 'ClCompile.*c"' ../win32/$(PROJECT).vcxproj | sed -e 's/.*\"\(.*\)\".*/\1/' | sed -e 's@\\@/@g')
+
+SRC := $(filter-out $(FILTER),$(BASE))
+SRC2 := $(filter-out $(FILTER),$(BASE2))
+
+OBJDIRBASE := obj/$(BUILD)
+OBJDIR := $(OBJDIRBASE)/o/o/o
+
+OBJ := $(addprefix $(OBJDIR)/,$(SRC:%.cpp=%.o))
+OBJ2 := $(addprefix $(OBJDIR)/,$(SRC2:%.c=%.o))
+
+all: $(IMAGE)
+
+$(OBJDIR)/%.o: %.cpp
+ $(CXX) -c $(INCLUDES) $(CXXFLAGS) $(DEFINES) $< -o $@
+
+$(OBJDIR)/%.d : %.cpp
+ @echo Resolving dependencies of $<
+ @mkdir -p $(@D)
+ @$(CXX) -MM $(INCLUDES) $(CXXFLAGS) $(DEFINES) $< > $@.$$$$; \
+ sed 's,.*\.o[ :]*,$(OBJDIR)/$(<:.cpp=.o) $@ : ,g' < $@.$$$$ > $@; \
+ rm -f $@.$$$$
+
+$(OBJDIR)/%.o: %.c
+ $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
+
+$(OBJDIR)/%.d : %.c
+ @echo Resolving dependencies of $<
+ @mkdir -p $(@D)
+ @$(CC) -MM $(INCLUDES) $(CFLAGS) $(DEFINES) $< > $@.$$$$; \
+ sed 's,.*\.o[ :]*,$(OBJDIR)/$(<:.c=.o) $@ : ,g' < $@.$$$$ > $@; \
+ rm -f $@.$$$$
+
+$(IMAGE): $(OBJ) $(OBJ2)
+ $(CXX) $(CXXFLAGS) $(DEFINES) $(OBJ) $(OBJ2) $(LIBS) -o $@
+
+ifneq "$(MAKECMDGOALS)" "clean"
+-include $(addprefix $(OBJDIR)/,$(SRC:.cpp=.d)) %(addprefix $(OBJDIR)/,$(SRC2:.c=.d))
+endif
+
+clean:
+ rm -rf $(OBJDIRBASE) $(IMAGE)*
+
+.PHONY: clean all
diff --git a/update/build/unix/debug.mk b/update/build/unix/debug.mk
new file mode 100644
index 00000000..04d925a6
--- /dev/null
+++ b/update/build/unix/debug.mk
@@ -0,0 +1,11 @@
+ARCH := $(shell uname -m)
+
+CFLAGS := -g3 -Wall
+DEFINES := -DDEBUG
+BUILD := debug
+
+ifeq ($(ARCH),x86_64)
+CFLAGS += -msse4.1
+endif
+
+include build.mk
diff --git a/update/build/unix/release.mk b/update/build/unix/release.mk
new file mode 100644
index 00000000..030063e3
--- /dev/null
+++ b/update/build/unix/release.mk
@@ -0,0 +1,11 @@
+ARCH := $(shell uname -m)
+
+CFLAGS := -O3 -s -fomit-frame-pointer
+DEFINES := -DNDEBUG
+BUILD := release
+
+ifeq ($(ARCH),x86_64)
+CFLAGS += -msse4.1
+endif
+
+include build.mk
diff --git a/update/build/win32/update.sln b/update/build/win32/update.sln
new file mode 100644
index 00000000..dfa1a789
--- /dev/null
+++ b/update/build/win32/update.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27428.2002
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "update", "update.vcxproj", "{447D58BF-94CD-4469-BB90-549C05D03E00}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {447D58BF-94CD-4469-BB90-549C05D03E00}.Debug|x64.ActiveCfg = Debug|x64
+ {447D58BF-94CD-4469-BB90-549C05D03E00}.Debug|x64.Build.0 = Debug|x64
+ {447D58BF-94CD-4469-BB90-549C05D03E00}.Release|x64.ActiveCfg = Release|x64
+ {447D58BF-94CD-4469-BB90-549C05D03E00}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {3E51386C-43EA-44AC-9F24-AFAFE4D63ADE}
+ EndGlobalSection
+EndGlobal
diff --git a/update/build/win32/update.vcxproj b/update/build/win32/update.vcxproj
new file mode 100644
index 00000000..73a4ce78
--- /dev/null
+++ b/update/build/win32/update.vcxproj
@@ -0,0 +1,164 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {447D58BF-94CD-4469-BB90-549C05D03E00}
+ update
+ 10.0.16299.0
+
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level3
+ Disabled
+ true
+ true
+
+
+
+
+ Level3
+ Disabled
+ true
+ true
+ true
+ TRACY_NO_STATISTICS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32_LEAN_AND_MEAN;NOMINMAX;_USE_MATH_DEFINES;%(PreprocessorDefinitions)
+ AdvancedVectorExtensions2
+ stdcpp17
+
+
+ ws2_32.lib;%(AdditionalDependencies)
+ Console
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ true
+ TRACY_NO_STATISTICS;NDEBUG;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32_LEAN_AND_MEAN;NOMINMAX;_USE_MATH_DEFINES;%(PreprocessorDefinitions)
+ AdvancedVectorExtensions2
+ stdcpp17
+
+
+ true
+ true
+ ws2_32.lib;%(AdditionalDependencies)
+ Console
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/update/build/win32/update.vcxproj.filters b/update/build/win32/update.vcxproj.filters
new file mode 100644
index 00000000..025d58a1
--- /dev/null
+++ b/update/build/win32/update.vcxproj.filters
@@ -0,0 +1,96 @@
+
+
+
+
+ {729c80ee-4d26-4a5e-8f1f-6c075783eb56}
+
+
+ {cf23ef7b-7694-4154-830b-00cf053350ea}
+
+
+ {e39d3623-47cd-4752-8da9-3ea324f964c1}
+
+
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+ server
+
+
+ server
+
+
+ src
+
+
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+ server
+
+
+ server
+
+
+ server
+
+
+ server
+
+
+ server
+
+
+ server
+
+
+ server
+
+
+ server
+
+
+ server
+
+
+ common
+
+
+ common
+
+
+ common
+
+
+
\ No newline at end of file
diff --git a/update/src/update.cpp b/update/src/update.cpp
new file mode 100644
index 00000000..758ab71e
--- /dev/null
+++ b/update/src/update.cpp
@@ -0,0 +1,65 @@
+#ifdef _WIN32
+# include
+#endif
+
+#include
+#include
+#include
+
+#include "../../server/TracyFileRead.hpp"
+#include "../../server/TracyFileWrite.hpp"
+#include "../../server/TracyWorker.hpp"
+
+void Usage()
+{
+ printf( "Usage: update input.tracy output.tracy\n" );
+ exit( 1 );
+}
+
+int main( int argc, char** argv )
+{
+#ifdef _WIN32
+ if( !AttachConsole( ATTACH_PARENT_PROCESS ) )
+ {
+ AllocConsole();
+ SetConsoleMode( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 );
+ }
+#endif
+
+ if( argc != 3 ) Usage();
+
+ const char* input = argv[1];
+ const char* output = argv[2];
+
+ auto f = std::unique_ptr( tracy::FileRead::Open( input ) );
+ if( !f )
+ {
+ fprintf( stderr, "Cannot open input file!\n" );
+ exit( 1 );
+ }
+
+ try
+ {
+ tracy::Worker worker( *f );
+
+ auto w = std::unique_ptr( tracy::FileWrite::Open( output ) );
+ if( !w )
+ {
+ fprintf( stderr, "Cannot open output file!\n" );
+ exit( 1 );
+ }
+ worker.Write( *w );
+ }
+ catch( const tracy::UnsupportedVersion& e )
+ {
+ fprintf( stderr, "The file you are trying to open is from the future version.\n" );
+ exit( 1 );
+ }
+ catch( const tracy::NotTracyDump& e )
+ {
+ fprintf( stderr, "The file you are trying to open is not a tracy dump.\n" );
+ exit( 1 );
+ }
+
+ return 0;
+}