Thanx for the guidance. I tried out tapestry-offline and it works very nicely for me, I think I will stick with this one.
I had one configuration problem with tapestry-offline (maybe a bug?): I was getting exception when GZIP compression was turned on (full stack trace below). When I turned off gzip compression in my AppModule, the exception disappeared: configuration.add(SymbolConstants.GZIP_COMPRESSION_ENABLED, false); Full stack trace: Caused by: java.lang.NullPointerException: Unable to delegate method invocation to property 'HTTPServletRequest' of <Proxy for RequestGlobals(org.apache.tapestry5.services.RequestGlobals)>, because the property is null. at $HttpServletRequest_5af77769928a.readProperty(Unknown Source) at $HttpServletRequest_5af77769928a.getProtocol(Unknown Source) at $HttpServletRequest_5af777699289.getProtocol(Unknown Source) at org.apache.tapestry5.internal.services.ResponseCompressionAnalyzerImpl.isGZipSupported(ResponseCompressionAnalyzerImpl.java:50) at org.apache.tapestry5.internal.services.ResponseCompressionAnalyzerImpl.isGZipEnabled(ResponseCompressionAnalyzerImpl.java:75) at $ResponseCompressionAnalyzer_5af777699283.isGZipEnabled(Unknown Source) at org.apache.tapestry5.internal.services.AbstractAssetFactory.isCompressable(AbstractAssetFactory.java:58) at org.apache.tapestry5.internal.services.AbstractAssetFactory$1.toClientURL(AbstractAssetFactory.java:89) at org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructorImpl$1.map(JavaScriptStackPathConstructorImpl.java:54) at org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructorImpl$1.map(JavaScriptStackPathConstructorImpl.java:51) at org.apache.tapestry5.func.LazyMappedValue.get(LazyMappedValue.java:31) at org.apache.tapestry5.func.LazyFlow.first(LazyFlow.java:52) at org.apache.tapestry5.func.AbstractFlow$1.next(AbstractFlow.java:62) at org.apache.tapestry5.func.AbstractFlow.toMutableList(AbstractFlow.java:41) at org.apache.tapestry5.func.AbstractFlow.toMutableList(AbstractFlow.java:34) at org.apache.tapestry5.func.AbstractFlow.toList(AbstractFlow.java:199) at org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructorImpl.toPaths(JavaScriptStackPathConstructorImpl.java:98) at org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructorImpl.constructPathsForJavaScriptStack(JavaScriptStackPathConstructorImpl.java:91) at $JavaScriptStackPathConstructor_5af77769930e.constructPathsForJavaScriptStack(Unknown Source) at org.apache.tapestry5.internal.services.ajax.JavaScriptSupportImpl.addAssetsFromStack(JavaScriptSupportImpl.java:361) at org.apache.tapestry5.internal.services.ajax.JavaScriptSupportImpl.importStack(JavaScriptSupportImpl.java:414) at org.apache.tapestry5.modules.TapestryModule$29.renderMarkup(TapestryModule.java:1797) at $MarkupRenderer_5af77769930f.renderMarkup(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$28.renderMarkup(TapestryModule.java:1785) at $MarkupRenderer_5af77769930f.renderMarkup(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$27.renderMarkup(TapestryModule.java:1769) at $MarkupRenderer_5af77769930f.renderMarkup(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$26.renderMarkup(TapestryModule.java:1753) at $MarkupRenderer_5af77769930f.renderMarkup(Unknown Source) at org.apache.tapestry5.modules.JavaScriptModule$1.renderMarkup(JavaScriptModule.java:237) at $MarkupRenderer_5af77769930f.renderMarkup(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$25.renderMarkup(TapestryModule.java:1736) at $MarkupRenderer_5af77769930f.renderMarkup(Unknown Source) at $MarkupRenderer_5af77769930a.renderMarkup(Unknown Source) at org.apache.tapestry5.internal.services.PageMarkupRendererImpl.renderPageMarkup(PageMarkupRendererImpl.java:47) at $PageMarkupRenderer_5af777699308.renderPageMarkup(Unknown Source) at org.apache.tapestry5.internal.services.PageResponseRendererImpl.renderPageResponse(PageResponseRendererImpl.java:64) at $PageResponseRenderer_5af7776992c9.renderPageResponse(Unknown Source) at org.apache.tapestry5.internal.services.PageRenderRequestHandlerImpl.handle(PageRenderRequestHandlerImpl.java:72) at org.apache.tapestry5.modules.TapestryModule$34.handle(TapestryModule.java:1962) at $PageRenderRequestHandler_5af7776992cb.handle(Unknown Source) at $PageRenderRequestHandler_5af7776992c5.handle(Unknown Source) at org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handlePageRender(ComponentRequestHandlerTerminator.java:48) at org.apache.tapestry5.services.InitializeActivePageName.handlePageRender(InitializeActivePageName.java:47) at $ComponentRequestHandler_5af7776992c6.handlePageRender(Unknown Source) at org.apache.tapestry5.internal.services.RequestOperationTracker$2.run(RequestOperationTracker.java:73) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.run(OperationTrackerImpl.java:55)