Hi @[deleted]! Cheers for releasing mate, I've jotted down some random thoughts, might be of help: Does the firstRun stuff do anything? I've not seen that before. Nice. I was thinking about upgrades & database initialisation etc.. for plugins I mean, didn't know how it would handle it. Does your callbackDispatch function work properly? When I had mine inside the plugin, it kept instantiating the Plugin, so I had to extrude it.. was annoying. Maybe my version of osTicket wasn't running that code statically.. hmm. Ahh, just had a poke at the manual, class.signal.php uses call_user_func_array, so the $callable passed to Signal: in PHP 5.3+ should be "ClassName:", not array("Class","normalMethod"); Hmm. That could be where I went wrong. Probably won't work for Dispatcher methods.. hmm. Dispatcher:() is ugly! http://php.net/manual/en/function.call-user-func-array.phpIt appears the Jasper server has a compiled version of the report definition to work from, not the xml. So it might not be editable live. Which makes sense.. But to configure the Jaspersoft\Client\Client it is necessary. Next you'll be needing a field, I'm thinking a textfield to enter CSV for the RunnableReports list.. '/reports/osTicket/HelpTopics,/reports/osTicket/AgentStats,/reports/osTicket/Users,/reports/osTicket/Delays' or something.. At least then your call to reportService()->runReport could be administratively defined. Why is help-topics.php in it's own file? It seems like the controller you made could be part of the plugin itself, rather than a whole separate thing. Why do you need to change class.osticket.php? I don't understand the addition of that variable. What does it do? Is it purely for the Nav entries changes in navigation.tmpl.php?Doesn't your Plugin add it's own Menu entry? I believe you can modify $nav after calling require('staff.inc.php'); in the same scope.Woah, never seen an integrity attribute in a link before, that's cool! (Although, apparently not standard anywhere: http://stackoverflow.com/questions/32039568/what-are-the-integrity-and-crossorigin-attribute) I'm seeing $config, min & future in the reports.html file javascript, but I can't see how that gets set. Maybe you need a capture pattern in your searchAction line, like: $search_url = url('^/jasper-reports/', patterns('controller\jaspercontroller', url_get('^search/$', 'searchAction'), url_post('^jasper-stats/(?P<start_date>.+)/(?P<end_date>.+)/(?P<args>.+)?$', 'getTicketStats')); // based on /scp/ajax.php examples, likely wrong...