--- /dev/null
+use strict;
+use warnings;
+use FindBin qw/$Bin/;
+use lib "$Bin/lib";
+
+use Test::More;
+use Catalyst::Test 'KeepStash';
+
+my $content;
+
+$content = get('/subrequest_keepstash_index');
+
+# Because of the way SubRequest and Catalyst interact, the first level of the stash will get copied. On return to the root request,
+# the first level of the stash will remain intact. Deep datastructures will be changed by subrequests, though
+like($content, qr/-------ROOT------------\nShallow value: 5\nDeep Value: 9\n/, 'Got expected values in the stash');
+like($content, qr/-------1st-------------\nShallow value: 6\nDeep Value: 10\nNew Value: \n/, 'Got expected values in the 1st call');
+like($content, qr/-------2nd-------------\nShallow value: 6\nDeep Value: 11\nNew Value: \n/, 'Got expected values in the 2nd call');
+
+$content = get('/visit_keepstash_index');
+like($content, qr/-------ROOT------------\nShallow value: 5\nDeep Value: 9\n/, 'Got expected values in the stash');
+like($content, qr/-------1st-------------\nShallow value: 6\nDeep Value: 10\nNew Value: \n/, 'Got expected values in the 1st call');
+like($content, qr/-------2nd-------------\nShallow value: 7\nDeep Value: 11\nNew Value: new\n/, 'Got expected values in the 2nd call');
+
+done_testing;
--- /dev/null
+package KeepStash;
+
+use strict;
+use warnings;
+
+use Catalyst::Runtime '5.70';
+
+use base qw/Catalyst/;
+use Catalyst qw/
+ SubRequest
+/;
+
+our $VERSION = '0.01';
+
+
+__PACKAGE__->config( name => 'KeepStash' );
+
+__PACKAGE__->setup();
+
+1;
--- /dev/null
+package KeepStash::Controller::Root;
+
+use strict;
+use warnings;
+use base 'Catalyst::Controller';
+
+__PACKAGE__->config->{namespace} = '';
+
+sub subrequest_keepstash_index : Path('subrequest_keepstash_index') :Args(0) {
+ my ($self, $c) = @_;
+ $c->stash->{'stash_value'} = 5;
+ $c->stash->{'deep'}->{'stash_value'} = 9;
+}
+
+sub visit_keepstash_index : Path('visit_keepstash_index') :Args(0) {
+ my ($self, $c) = @_;
+ $c->stash->{'stash_value'} = 5;
+ $c->stash->{'deep'}->{'stash_value'} = 9;
+}
+
+sub keepstash_call : Path('keepstash_call') :Args(0) {
+ my ($self, $c) = @_;
+ $c->stash->{'stash_value'}++;
+ $c->stash->{'deep'}->{'stash_value'}++;
+}
+
+sub end : ActionClass('RenderView') {}
+
+1;
--- /dev/null
+package KeepStash::View::TT;
+use Moose;
+
+extends 'Catalyst::View::TT';
+with 'Catalyst::View::Component::SubInclude';
+
+__PACKAGE__->config(
+ TEMPLATE_EXTENSION => '.tt',
+ subinclude_plugin => 'SubRequest',
+ subinclude_plugin => 'Visit',
+ subinclude => {
+ 'SubRequest' => {
+ keep_stash => 1
+ },
+ 'Visit' => {
+ keep_stash => 1
+ }
+ },
+);
+
+1;
--- /dev/null
+Shallow value: [% stash_value %]
+Deep Value: [% deep.stash_value %]
+New Value: [% new_value; c.stash.new_value = 'new' %]
--- /dev/null
+-------ROOT------------
+Shallow value: [% stash_value %]
+Deep Value: [% deep.stash_value %]
+-------1st-------------
+[% subinclude_using('SubRequest', '/keepstash_call') %]
+-------2nd-------------
+[% subinclude_using('SubRequest', '/keepstash_call') %]
--- /dev/null
+-------ROOT------------
+Shallow value: [% stash_value %]
+Deep Value: [% deep.stash_value %]
+-------1st-------------
+[% subinclude_using('Visit','/keepstash_call') %]
+-------2nd-------------
+[% subinclude_using('Visit','/keepstash_call') %]