diff --git a/+Movie/awaitRenderDone.m b/+Movie/awaitRenderDone.m
new file mode 100644
index 0000000000000000000000000000000000000000..92797b2a27301606fa9b6f5dc9af268997ce2eec
--- /dev/null
+++ b/+Movie/awaitRenderDone.m
@@ -0,0 +1,15 @@
+function bCompleted = awaitRenderDone(timeout, uiserver_info)
+    bCompleted=false;
+    
+    elapsed = 0;
+    chk_timer = tic();
+    while ( ~bCompleted && (timeout <= 0 || elapsed <= timeout) )
+        bCompleted = webread([uiserver_info.host '/drawComplete'], uiserver_info.opts);
+        if ( bCompleted )
+            return;
+        end
+        
+        pause(0.5);
+        elapsed = toc(chk_timer);
+    end
+end
diff --git a/+Movie/render_rot_movie.m b/+Movie/render_rot_movie.m
new file mode 100644
index 0000000000000000000000000000000000000000..0aee77d5bc3816561eacd8cd5062165d1ece7523
--- /dev/null
+++ b/+Movie/render_rot_movie.m
@@ -0,0 +1,120 @@
+function render_rot_movie(movieName, lAngle, rAngle)
+    %% Load initial view_params
+    web_opts = weboptions('Timeout',60);
+    uiserver_info = struct('host','http://localhost:4444', ...
+                            'opts',web_opts);
+
+	view_params = pull_params(uiserver_info);
+    
+    %% Setup movie framce-cap dir
+    dataDir = 'Data';
+    frameDir = fullfile(dataDir, [movieName '_frames']);
+    if ( ~exist(frameDir, 'dir') )
+        mkdir(frameDir);
+    end
+    
+    %% Setup rotation matrices
+    nsteps = 45;
+    stepAngle = 2*(rAngle - lAngle) / nsteps;
+    
+    Rs = [cosd(stepAngle) 0 sind(stepAngle) 0;
+        0 1 0 0;
+        -sind(stepAngle) 0 cosd(stepAngle) 0
+        0 0 0 1];
+    
+    Rinit = [cosd(lAngle) 0 sind(lAngle) 0;
+            0 1 0 0;
+            -sind(lAngle) 0 cosd(lAngle) 0
+            0 0 0 1];
+    
+    W = reshape(view_params.worldRot, 4,4);
+    Wi = Rinit * W;
+    
+    %% Prep rendering
+    Movie.movie_enable_uitoolbars(false, uiserver_info);
+    push_params(Wi, view_params, uiserver_info);
+    pause(0.5);
+    
+    %% Try to wait for last initial-render to complete
+    if ( ~Movie.awaitRenderDone(300, uiserver_info) )
+        error('Full rendering timed-out after 5 minutes!');
+    end
+    
+    pause(0.5);
+    
+    for i=1:nsteps
+        if ( i > 1 )
+            Wi = Rs * Wi;
+        end
+        
+        frameFile = fullfile(frameDir, [movieName '_t' num2str(i, '%04d') '.png']);
+        
+        push_params(Wi, view_params, uiserver_info);
+         %% Try to wait for last initial-render to complete
+        if ( ~Movie.awaitRenderDone(300, uiserver_info) )
+            error('Full rendering timed-out after 5 minutes!');
+        end
+
+        pause(0.5);
+        
+        %% Write frame to directory
+        imFrame = webread([uiserver_info.host '/screenCap'], web_opts);
+        
+        frameSize = [size(imFrame,1) size(imFrame,2)];
+        
+        framePad = mod(frameSize,2);
+        imPad = zeros([frameSize + framePad, 3], 'like',imFrame);
+        
+        imPad(1:frameSize(1),1:frameSize(2),:) = imFrame;
+        
+        imwrite(imPad, frameFile, 'png');
+    end
+    
+    for i=1:nsteps
+        Wi = (Rs') * Wi;
+        
+        frameFile = fullfile(frameDir, [movieName '_t' num2str(i+nsteps, '%04d') '.png']);
+        
+        push_params(Wi, view_params, uiserver_info);
+         %% Try to wait for last initial-render to complete
+        if ( ~Movie.awaitRenderDone(300, uiserver_info) )
+            error('Full rendering timed-out after 5 minutes!');
+        end
+
+        pause(0.5);
+        
+        %% Write frame to directory
+        imFrame = webread([uiserver_info.host '/screenCap'], web_opts);
+        
+        frameSize = [size(imFrame,1) size(imFrame,2)];
+        
+        framePad = mod(frameSize,2);
+        imPad = zeros([frameSize + framePad, 3], 'like',imFrame);
+        
+        imPad(1:frameSize(1),1:frameSize(2),:) = imFrame;
+        
+        imwrite(imPad, frameFile, 'png');
+    end
+    
+    fps = 30;
+    resx = 1920;
+    inpattern = fullfile(frameDir,[movieName '_t%04d.png']);
+    movieFile = fullfile('update_movies', [movieName '.mp4']);
+
+    ffmpegStr = sprintf('ffmpeg -y -i %s -vf scale=%d:-1 -preset veryslow -crf 28 -pix_fmt yuv420p -r %d %s', inpattern, resx, fps, movieFile);
+    status = system(ffmpegStr);
+    
+end
+
+function push_params(W, view_params, uiserver_info)
+    uiserver_info.opts.MediaType = 'application/json';
+    
+    view_params.worldRot = W(:);
+    webwrite([uiserver_info.host '/view'], view_params, uiserver_info.opts);
+end
+
+function view_params = pull_params(uiserver_info)
+    uiserver_info.opts.MediaType = 'application/json';
+    
+    view_params = webread([uiserver_info.host '/view'], uiserver_info.opts);
+end
diff --git a/+Movie/rendermovie.m b/+Movie/rendermovie.m
index b6de1a6868beb998832581cfc44513d7468e5cbc..c9149c78bcba34cfb1786c7bc12bd84a93a17fd7 100644
--- a/+Movie/rendermovie.m
+++ b/+Movie/rendermovie.m
@@ -21,7 +21,7 @@ function rendermovie(movieName, startFrame, endFrame)
     pause(0.5);
     
     %% Try to wait for last initial-render to complete
-    if ( ~awaitRenderDone(300, uiserver_info) )
+    if ( ~Movie.awaitRenderDone(300, uiserver_info) )
         error('Full rendering timed-out after 5 minutes!');
     end
     
@@ -83,7 +83,7 @@ function rendermovie(movieName, startFrame, endFrame)
         webwrite([uiserver_info.host '/time/' num2str(time)] ,'');
 
         %% Wait for complete volume render
-        if ( ~awaitRenderDone(300, uiserver_info) )
+        if ( ~Movie.awaitRenderDone(300, uiserver_info) )
             error('Full rendering timed-out after 5 minutes!');
         end
         
@@ -120,19 +120,3 @@ function rendermovie(movieName, startFrame, endFrame)
 %         rmdir(frameDir,'s');
 %     end
 end
-
-function bCompleted = awaitRenderDone(timeout, uiserver_info)
-    bCompleted=false;
-    
-    elapsed = 0;
-    chk_timer = tic();
-    while ( ~bCompleted && (timeout <= 0 || elapsed <= timeout) )
-        bCompleted = webread([uiserver_info.host '/drawComplete'], uiserver_info.opts);
-        if ( bCompleted )
-            return;
-        end
-        
-        pause(0.5);
-        elapsed = toc(chk_timer);
-    end
-end
diff --git a/+Stats/make_movie_table.m b/+Stats/make_movie_table.m
index 2d8d2934956ed56d235e70eeddba06b3c4a7f8de..c1cbca233b28c329380ccc18bf9bcc31ac5666b0 100644
--- a/+Stats/make_movie_table.m
+++ b/+Stats/make_movie_table.m
@@ -8,7 +8,7 @@ exp_types = vertcat(exp_types{:});
 
 tsmp = arrayfun(@(x)(median(diff(x.tsmp))), ecto_size_stats);
 
-bExcludeMotion = (tsmp >= 7.0);
+bExcludeMotion = ((tsmp >= 7.0) | (tsmp <= 5.0));
 exclMotSrt = repmat({'A'}, length(bExcludeMotion),1);
 exclMotSrt(bExcludeMotion) = {'B'};
 
@@ -21,7 +21,7 @@ chkrows = vertcat(chkrows{:});
 [~,srtidx] = sortrows(chkrows);
 
 fid = fopen('sup_table_info.csv','wt');
-fprintf(fid, 'Dataset,Treatment,dt (sec),First Frame Vesicles (Mesoderm),Motion Statistics,First Frame Vesicles (Ectoderm),Total Vesicles (Mesoderm),Total Vesicles (Ectoderm)\n');
+fprintf(fid, 'Dataset,Treatment,dt (sec),Motion Statistics,First Frame Vesicles (Mesoderm),First Frame Vesicles (Ectoderm),Total Vesicles (Mesoderm),Total Vesicles (Ectoderm)\n');
 for i=1:length(srtidx)
     idx = srtidx(i);
     
diff --git a/make_movie_script.m b/make_movie_script.m
new file mode 100644
index 0000000000000000000000000000000000000000..dc597fd3d900734c68fb8c72bf42bbf324111f32
--- /dev/null
+++ b/make_movie_script.m
@@ -0,0 +1,11 @@
+%% Set the current movie name
+movieName = '2016-06-29_tl1p0_bb94';
+
+%% Save out movie-making parameters
+save_movie_params(movieName);
+
+%% Set the parameters (and make sure everything looks good)
+set_movie_params(movieName);
+
+%% Start the movie render (usually up to 200 frames)
+rendermovie(movieName, 1,170);