I just tried to flash the LEDE firmware onto a TP-Link Archer C7 v2.0 (EU) router and ran into some problems. Because of some EU frequency regulations the manufacturers had to lock down their devices and therefore use more or less woking strategies  to prevent the installation of alternative firmware(s) like OpenWrt, DD-Wrt or LEDE.

While trying to upload the LEDE binary, the web interface threw the following error:

Error code: 18005

Upgrade unsuccessfully because the version of the upgraded file was incorrect. Please check the file name.

To bypass this, i had to rename the LEDE binary to the name of a official update file for the currently installed version:

Hardware Version: Archer C7 v2 00000000

Installed firmware: 3.15.1 Build 160616 Rel.44182n

  1. Download LEDE: LEDE For TP-LInk Archer C7 v2.0 EU in version 17.01.03
  2. Rename the file to: ArcherC7v2_en_eu_3_15_1_up_boot(160616).bin
  3. (Some people reported that your connected client must have a static ip address of for the upload to work , but maybe this is not necessary. Please comment if it works with other IPs.)
  4. Go to the admin interface (with factory firmware installed) of the router and upload the renamed file under “System Tools” -> “Firmware Upgrade”.
  5. System should reboot into the LuCI web interface of LEDE.


If you are compiling your Apache Tapestry application inside IntelliJ IDEA your class files will end up in the wrong directory and therefore Tapestry will not pick up the changes via live class-reloading. Solution: change the build output directories in your build.gradle file.

idea {
  module {
    inheritOutputDirs = false
    outputDir = file("build/classes/main")
    testOutputDir = file('build/classes/test')

tl;dr: If gradle jettyRun fails because of the port still being in use from a prior execution-> configure and use the jettyStop task before by changing your build.gradle.

jettyRun {
    stopKey = "tapJettyStop"
    stopPort = 9087

jettyStop {
    stopKey = "tapJettyStop"
    stopPort = 9087

jettyRun.dependsOn jettyStop

While developing Apache Tapestry-WebApps with the IntelliJ IDEA-IDE, i couldn’t stop the running the gradle task jettyRun. IDEA seems to run the gradle-task as a daemon in the background. Stopping the task execution from IDEA resulted in jetty still running in the background. To solve this, the gradle jetty plugin brings the task jettyStop, but this doesn’t work out-of-the-box. You have to configure stopKey and stopPort properties to somewhat “connect” the two tasks (jettyStop needs to know which jetty instance to stop). Now it is sufficent to only execute jettyRun. jettyStop is executed automatically prior to every execution of jettyRun.

I use the open source mindmapping software freeplane on a day to day basis. Because of its java nature the gui tends to cause a little bit of eye strain for the spoiled average mac / apple user, but the rich feature set makes up for that! Freeplane has an integrated scripting api which can be used to freely manipulate the nodes, attributes and connections of a mindmap with javascript or groovy.

I recently had the need to paste mindmap structures into a redmine wiki (which uses the textile markup) and groovy was still on my “look into it soon”-list. So i took the chance.

Here’s the gist:
-> Most recent version on github

import javax.swing.*;

*	Export Freeplane mindmap branch to nested list in textile format e.g. for use in Redmine wiki
*	- Save as <filename>.groovy in <freeplane directory>/scripts/
	- Select node and start script from menu: Tools -> Scripts -> <filename>

def process(thisNode, childPosition) {
		def result =""
		result = prefix(childPosition) + thisNode.text + suffix(childPosition)
    	thisNode.children.each {
        result += process(it, childPosition + 1)
    return result
def showDialog(String text) {
    def dialog = new JDialog(ui.frame)
    dialog.setSize(500, 700)
    dialog.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE )
    dialog.add(new JScrollPane(new JTextArea(text)))
    dialog.visible = true

def prefix(position){
	if(position == 0){
		return "h1. "
	} else if (position == 1){
		return "\nh2. "
	} else {
		return "*".multiply(position-1)+" "

def suffix(position){
	if(position == 0){
		return "\n"
	} else if (position == 1){
		return "\n\n"
	} else {
		return "\n"
def output = process(node, 0);