Pages: 1 ... 7 8 [9] 10 11 ... 13
Author Topic: 1981 VW T3 1.8turbo build  (Read 258071 times)
TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #120 on: May 27, 2016, 05:11:02 AM »

I had the manifold machined flat and then welded in the egt probe. Next step is to coat it and I'm waiting for the new turbine housing to arrive. I ordered 2 k04-020 hotsides because the original one had too many cracks.






Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #121 on: June 23, 2016, 02:29:20 AM »

I had some major clutch revision, because my pilot bearing in the crank took a piss and left some parts between the pressure plate and clutch.
After some searching I came to a completely new and untested setup with the modified 240mm single mass flywheel. I am now running a Audi v6 unsprung clutch with Porsche 911 996 clutch cover (Sachs SRE).
Clutch cover Sachs SRE 883082 999736 (PORSCHE OE-99611602701)


old vs new pressure plate


Bought new throw out bearing and needle bearing too


Bought this Sachs V8 disk, but after fitting it did not work because of the height of the center section with springs allmost touching the fingers of the pressure plate!


Too bad... Its for sale, €100,-.
Then bought a V6 unsprung Sachs clutch to make sure I did not have this issue anymore.
Clutch disk Sachs 1864 528 441 (AUDI OE-034141032L)


Had to modify the throw out bearing a bit to extend further out to contact pressure plate, there might be an oem solution for this.


Now this thing should hold up to around 550NM at the expense of being very heavy on the clutch pedal. We'll get used to that in time for sure. The clutch engagement is very smooth and controlled, and the added gearbox chatter is not too bad. I am confident about this clutch holding about anything I can throw at it with a stock block. If it decides to let go with the K04 (i highly doubt that) there is the option of the SRE clutch disk to hold 700NM. But I think I'll be fine with the smooth stock clutch disk. No lift shift is tested and has zero problems now!

While the gearbox was out, I took my time to revise a couple of things. Because it is flipped upside down, I had issues with breather location. I removed the differential to find a new location.


I used a bent brake line brazed to a 8mm copper tube to locate the breather between the ribs, away from oil splashing




Little filter on top, and done. No more oil spraying out of the breather now!


Also revised my shift mechanism, I used new uniballs with special rubber covers. Also made a better bracket, as can be seen above. This time shaped like a box to keep dirt out. This mechanism reverses the gear stick motion in both directions, so I can select all gears according to the normal Audi H pattern.


Gearbox support died from age and abuse


Bought new Powerflex


Reinforced gearbox bracket as well.


Fitting all parts on the driveway  Grin


Got 2 turbine housings on stock now, so after my holiday I will repeat the milling process on the fresh housing. The other new K04-022 housing is for sale, so if you are interested (Europe) feel free to contact me. I can beat the ebay price of other sellers  Wink Machined housing is also possible, but you'll have to use my spec wheel (2006 Mazdaspeed K04)






And got my new K04 flange ready, just got sent the wrong size center hole (76mm instead of 80mm). Need to turn it out on the lathe I guess.
« Last Edit: July 01, 2016, 08:10:22 AM by TijnCU » Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #122 on: August 06, 2016, 01:19:39 PM »

Clutch broke loose from center after 5000km  Embarrassed So unsprung stock clutch on solid flywheel is not a good idea... Had a new clutch custom made to fit with the pressure plate and still have springs in the center, and since then I have driven another 5000km without any problems. Did a 3600km holiday through the Alps, and everything was fine. Little hot intake after climbing long 8% mountain roads, so intercooling can be better. Thats all for later concern, first up is building the turbo for more powah  Grin

"defective" clutch


new custom clutch




clearance with pressure plate
« Last Edit: August 14, 2016, 05:51:11 AM by TijnCU » Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #123 on: August 21, 2016, 01:23:29 AM »

Spent the evening on finishing my turbo (finally!) Result is very pleasing, exactly 0.5mm clearance between housing and turbine wheel.
The turbine inducer area is also modified, since my turbine wheel has 8mm inducer tip height.


Also re-skimmed my manifold on a big belt grinder, because the guy that skimmed the manifold did it in 2 grinding passes Huh and left some unevenness. Now it is nice and flat without tracks.  


chra fitted, wastegate is also slightly ported






I'm going to do some finishing touches to the housings, like polish the inlet and port out the wastegate and exhaust inlet a bit more. Then, coat the manifold and bolt the assembly to my engine!
To deal with the added hot airflow, I decided to switch from air/air to water/air. There will be a 500x300mm radiator in front of the engine radiator and this should be more than adequate for charge cooling the expected airflow. The twin sidemounts in the back of the car will not be sufficient, because it already gets fairly hot now on k03.
« Last Edit: August 21, 2016, 01:32:40 AM by TijnCU » Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #124 on: September 08, 2016, 10:57:04 AM »

Just for the cool picture here


Coated and baked the manifold and housing



Testfit


Removed camber from rear suspension with a neat shim. At -1.5 degrees per wheel now.

Much better!


Radiator for charge cooler (ford fiesta 1.1 engine radiator  Grin)


Exomount radiator JDM style  Grin . No, this will be packaged between the front panel and radiator including a slim fan. Should work with available space...


And driven by this pump


Hope to receive parts within the next week. There is also a new wastegate actuator coming in, I bought a unit with adjustable spring to finetune.
« Last Edit: September 13, 2016, 01:06:20 AM by TijnCU » Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #125 on: September 13, 2016, 01:16:04 AM »

Made a custom actuator bracket


Fits very nice, and clears belt cover


Special menu


Actuator rod was 3cm too long, so I just cut and weld it instead of re-threading (stainless).


Plug n Play!
Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #126 on: October 06, 2016, 04:49:50 AM »

Hardware for AWIC complete


Removed head and pistons from spare block, engine is in top condition. AYP head will be replaced with this AEB head


Almost no carbon buildup on the inner pistons...


I will put forged connecting rods in this engine, but for now I still run the 280.000km AEB engine untill it dies. I inspected the cams through the oil filler hole, and my AEB cams look REALLY worn out compared to the set I have on stock. More power with the new head for sure  Grin The new AEB head will get new Supertech exhaust valves and uprated springs too for maximum durability. Rosten Performance rates their springs at 211lbs at full lift, which is more than the Supertech. Today I looked around for pricing on titanium alloy, I am considering to do a small batch (like 3 sets) of titanium spring retainers. If anyone is interested, I am willing to calculate pricing on those items. I have a starting company in performance parts and I'm willing to do starting offers to get the name out. I'm also considering to do a small batch of 144x19mm forged I beam rods for around 300€ per set.

Upcoming plans:
I will make a new center muffler this winter because I want to get the exhaust more silent. There is a lot of drone on the highway, and we're expecting another baby in February that I don't want to make deaf instantly. Industrial earmuffs would be an option too, but that looks stupid  Roll Eyes
My plan is as following:
There will be a 3" straight tube with electric valve, with the valve shut the gasses will leave the tube on the side into a 2" perforated tube towards the back. Then bounce back on the end cap of the muffler into another 2" perforated tube and through a chamber back in the 3" straight after the valve. Because I use a dual 2" setup, total tube ID area will be only be reduced by 10% when the valve is shut, but damping area is increased by 400%. The addition of chambers will get rid of the drone too. My final goal will be to control the exhaust valve with map switching and using the N80 output as a control trigger. Much like the new RS3 in dynamic mode  Smiley
Another advantage is that with the valve opened, I have even less dampening then I have now, since the 3" pipe will not be perforated anymore like it is now.
« Last Edit: October 07, 2016, 05:16:20 AM by TijnCU » Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #127 on: October 10, 2016, 01:43:44 PM »

Today I spent about an hour on my automatic map switching asm, I had a great idea to super-simplify it. I already located the ignition routine in IDA, so I took another look at it.
Code:
seg010:EE22 ; =============== S U B R O U T I N E =======================================
seg010:EE22
seg010:EE22 ; Ignition subroutine
seg010:EE22
seg010:EE22 sub_9EE22:
seg010:EE22                 mov     [-r0], r9
seg010:EE24                 mov     [-r0], r7
seg010:EE26                 mov     [-r0], r6
seg010:EE28                 sub     r0, #2
seg010:EE2A                 extp    #0E1h, #1 ; 'ß'
seg010:EE2E                 movb    rl4, fnwue    ; Cam switchover flag
seg010:EE32                 cmpb    rl4, #0FFh
seg010:EE36                 jmpr    cc_NZ, loc_9EE58 ; KFZW2
seg010:EE38                 mov     r12, #kfzw2
seg010:EE3C                 mov     r13, #33A6h
seg010:EE40                 mov     r14, word_380C80
seg010:EE44                 mov     r15, word_380C92
seg010:EE48                 calls   0, sub_78B8
seg010:EE4C                 movb    rl7, rl4
seg010:EE4E                 movb    zwnws, rl4
seg010:EE52                 movb    rl6, #0
seg010:EE54                 jmpa    cc_UC, loc_9EEE6

This part of the code makes the ecu choose either KFZW2 or KFZW1 depending on the cam changeover flag. My engine doesnt have variable cam timing, so KFZW1 would make the perfect map switching for me between petrol and lpg. I want to switch the mapping with the input from ushk (rear o2) since I dont use this one either. I located the ram variable for ushk and simply coded this adress in place of fnwue so the map will be chosen depending on voltage from the o2.

Code:
seg010:EE22 ; =============== S U B R O U T I N E =======================================
seg010:EE22
seg010:EE22 ; Ignition subroutine
seg010:EE22
seg010:EE22 sub_9EE22:
seg010:EE22                 mov     [-r0], r9
seg010:EE24                 mov     [-r0], r7
seg010:EE26                 mov     [-r0], r6
seg010:EE28                 sub     r0, #2
seg010:EE2A                 extp    #0E1h, #1 ; 'ß'
seg010:EE2E                 movb    rl4, ushk ; ushk @ RAM380973 >>  F3 F8 73 89
seg010:EE32                 cmpb    rl4, #0FFh
seg010:EE36                 jmpr    cc_NZ, loc_9EE58 ; KFZW2
seg010:EE38                 mov     r12, #kfzw2
seg010:EE3C                 mov     r13, #33A6h
seg010:EE40                 mov     r14, word_380C80
seg010:EE44                 mov     r15, word_380C92
seg010:EE48                 calls   0, sub_78B8
seg010:EE4C                 movb    rl7, rl4
seg010:EE4E                 movb    zwnws, rl4
seg010:EE52                 movb    rl6, #0
seg010:EE54                 jmpa    cc_UC, loc_9EEE6
Now, I simply changed this in the binary (F3 F8 0D 09 I replaced with F3 F8 73 89) and the ecu still boots. I started me7logger, and if I short pin 68 and 69 on the ecu the ram variable of ushk changes. The ecu does not brick or reboot Grin. Next step is to test this in the car with different (safe) ignition mappings and see if I succesfully hacked the ecu to force it into KFZW1. It is allmost too simple to be true, but we'll see what happens! Maybe it needs a bit more hacking, for instance if the variable is actually never at zero in the ecu. I'll just test that in the car first.  I'll let you guys know if it works.

** update 11 october
I thought about this and I need to rectify one thing. While fnwue is working like a flag in this part of the code, it is actually a factor. The next part of the routine consists of the interpolation between kfzw1 and kfzw2, so if I dont touch this code and the actual fnwue factor is <1 I wont get the (exact) ignition mapping I'm looking for. So I'll log if fnwue is 1 and if its not I'll replace it with a fixed factor in the code. Hope to test later today. If this works, maybe even a flex fuel sensor can be used to set a fake fnwue factor for use in bi fuel applications.I'll start a new topic about this if todays experiment works...
« Last Edit: October 11, 2016, 11:55:27 AM by TijnCU » Logged

nyet
Administrator
Hero Member
*****

Karma: +607/-168
Online Online

Posts: 12268


WWW
« Reply #128 on: October 10, 2016, 01:45:55 PM »

NICELY DONE

That is really cool.
Logged

ME7.1 tuning guide
ECUx Plot
ME7Sum checksum
Trim heatmap tool

Please do not ask me for tunes. I'm here to help people make their own.

Do not PM me technical questions! Please, ask all questions on the forums! Doing so will ensure the next person with the same issue gets the opportunity to learn from your ex
TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #129 on: October 11, 2016, 06:22:21 AM »

I'm really stoked about this idea, but maybe it will not work without other modifications to the code. I logged fnwue on my car, and with the engine running it is 0. So to fully understand what I need to do, lets take another look at the code that I have split into 3 sections
Code:
seg010:EE22 sub_9EE22:				;ROUTINE FOR ABSOLUTE KFZW2 INPUT
seg010:EE22                 mov     [-r0], r9
seg010:EE24                 mov     [-r0], r7
seg010:EE26                 mov     [-r0], r6
seg010:EE28                 sub     r0, #2
seg010:EE2A                 extp    #0E1h, #1 ; 'ß'
seg010:EE2E                 movb    rl4, fnwue ;move fnwue to rl4 //replace with ushk to manipulate
seg010:EE32                 cmpb    rl4, #0FFh ;compare byte #0FFh to rl4 //0FFh is the maximum value of a byte.
seg010:EE36                 jmpr    cc_NZ, loc_9EE58 ;if the result is Not Zero, jump to next part of the routine. if the result is Zero, then  
seg010:EE38                 mov     r12, #kfzw2 ;move contents of kfzw2 to r12
seg010:EE3C                 mov     r13, #33A6h
seg010:EE40                 mov     r14, word_380C80
seg010:EE44                 mov     r15, word_380C92
seg010:EE48                 calls   0, sub_78B8
seg010:EE4C                 movb    rl7, rl4
seg010:EE4E                 movb    zwnws, rl4
seg010:EE52                 movb    rl6, #0
seg010:EE54                 jmpa    cc_UC, loc_9EEE6 ;bypass kfzw1 routine
seg010:EE58 ; ---------------------------------------------------------------------------
So, what I can conclude from this code is that fnwue=0 is passed in the ecu as a value of FF.
I think that because if the difference between 0FFh and the value stored in fnwue has to be zero to actually run from the kfzw2 values. So, I need to find out what exact value I am giving to the ecu when I short the lambda2 input.

Next part of the code:
Code:
seg010:EE58
seg010:EE58 loc_9EE58:                               ;ROUTINE FOR ABSOLUTE KFZW1 INPUT
seg010:EE58                 extp    #0E1h, #1 ; 'ß'
seg010:EE5C                 movb    rl4, fnwue ;move byte fnwue to rl4    // change this for ushk as well
seg010:EE60                 jmpr    cc_NZ, loc_9EE80 ;jump to interpolation part of routine if the conditionflag Not Zero is set
seg010:EE62                 mov     r12, #kfzw1 ;move contents of kfzw1 to r12
seg010:EE66                 mov     r13, #33A6h
seg010:EE6A                 mov     r14, word_380C80
seg010:EE6E                 mov     r15, word_380C92
seg010:EE72                 calls   0, sub_78B8
seg010:EE76                 movb    rl6, rl4
seg010:EE78                 movb    zwnws, rl4
seg010:EE7C                 movb    rl7, #0
seg010:EE7E                 jmpr    cc_UC, loc_9EEE6 ;bypass interpolation routine
seg010:EE80 ; ---------------------------------------------------------------------------
Now, if I understand this part correctly it means that when the byte of fnwue is at a value of 0, the conditionflag 'Not Zero' will  not be set, and the content of kfzw1 is loaded into the registry. If there is any other value than 0 in fnwue, the routine jumps to the final section of code:

Code:
seg010:EE80
seg010:EE80 loc_9EE80:                               ;ROUTINE FOR INTERPOLATION KFZW2+KFZW1
seg010:EE80                 mov     r12, #kfzw2
seg010:EE84                 mov     r13, #33A6h
seg010:EE88                 mov     r14, word_380C80
seg010:EE8C                 mov     r15, word_380C92
seg010:EE90                 calls   0, sub_78B8
seg010:EE94                 extp    #0E1h, #1 ; 'ß'
seg010:EE98                 movbz   r5, fnwue
seg010:EE9C                 mul     r4, r5
seg010:EE9E                 mov     r4, word_FE0E
seg010:EEA2                 mov     [r0], r4
seg010:EEA4                 movb    rl7, [r0+1]
seg010:EEA8                 mov     r12, #kfzw1
seg010:EEAC                 mov     r13, #33A6h
seg010:EEB0                 mov     r14, word_380C80
seg010:EEB4                 mov     r15, word_380C92
seg010:EEB8                 calls   0, sub_78B8
seg010:EEBC                 extp    #0E1h, #1 ; 'ß'
seg010:EEC0                 movbz   r5, fnwue
seg010:EEC4                 mov     r2, #100h
seg010:EEC8                 sub     r2, r5
seg010:EECA                 mul     r4, r2
seg010:EECC                 mov     r4, word_FE0E
seg010:EED0                 mov     [r0], r4
seg010:EED2                 movb    rl6, [r0+1]
seg010:EED6                 movb    rl4, rl6
seg010:EED8                 addb    rl4, rl7
seg010:EEDA                 jmpr    cc_NV, loc_9EEE2
seg010:EEDC                 movb    rl4, #7Fh ; ''
seg010:EEE0                 addcb   rl4, #0

This is the part where from my understanding the interpolation and multiplication is done from the factor in fnwue.

To hack the code and force kfzw1 I think I have 2 options:
Find out what values my ushk gives when open and when shorted, if the shorted ushk gives a byte of 0 or 255 it follows the code and runs from either kfzw1 or kfzw2. The catch is that ushk must not give any other value than 255 or 0 or else it will go into interpolation mode.
If the open or shorted ushk does not give 0, maybe I just make it jump to loc_9EE62 so it completes this part of the routine anyway. It will then run from kfzw1 and skip the interpolation part. The only problem in this situation is that I still need the 255 value or I will disable kfzw2.
 
Lets find out!  Grin Any comments or tips are welcome, I really suck at asm.

I logged the variable ushk without any conversion, and it gives a value of 125 when its open and 38 when it is shorted to the output pin. I assume that these are the actual byte values. So either I need to change the ushk conversion, or just compare to 07Dh in code section #1 and change the jump in section #2. I´ll try to compile something and test it tonight  Shocked  


I have made a seperate topic for the kfzw switching function:
http://nefariousmotorsports.com/forum/index.php?topic=11558.0
« Last Edit: October 11, 2016, 11:56:02 AM by TijnCU » Logged

turbojohan
Full Member
***

Karma: +5/-0
Offline Offline

Posts: 185


« Reply #130 on: October 11, 2016, 07:15:56 AM »

Heel gaaf, Tijn.
Really cool if this all works.
Logged
TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #131 on: November 07, 2016, 05:23:53 AM »

The switching is functional now, see the other topic for how I did it. One thing I have to add is that I had a lambda B1S1 malfunction code after running lean for a minute while the switch condition was active. This code is set when the ecu sees a lean condition on B1S1 and a voltage over 0.46 on B1S2 over a set period of time. Now, the secondary o2 is coded out in my file, but it can still trigger this fault code it seems. I then hardcoded the value for the secondary o2 to 0.45v and have seen no fault codes ever since.

I will flash a more agressive timing map on it today and see how it responds  Grin Havent seen any CF's for over a year since I have been running petrol timing on lpg. Now its time to look for the hidden power.
At the same time, my driveshafts are taking a dump on me again (this is my 3rd set, genuine GKN/Lobro CV's that just get destroyed from the torque at my driveshaft angle, its a common 4wd offroad issue normally but i managed to introduce it to a lowered 2wd street car....) and I'm getting a bit sick of it. I hope to develop a custom set of gears soon to flip the box back into its natural position (drive flanges low, axles straight) and get my CV joints to actually last over 5 months...
Dumping the clutch in a frustrated mood did not help for the sound effects that I get when driving... (clunk clunk clunk)
** did a log with the new ignition settins, still no CF. added another 3*  Grin
Clunking noises have been identified this morning, I spent a couple of minutes under the car and found out that the CV's are fine. When spinning the wheels, I would get very metallic clicking noises from... the gearbox. So I added about 3(!) litres of oil and now it is a lot quieter. Looking for a new gearbox now, seems like there is a ton of play on the differential. Maybe if it lets go I'll just weld it shut untill I get my previous plan with custom gears up to speed...
*** Just did a quick testdrive, in my own street the box was clicking like it was going to die, the next street it was a bit more quiet. Did a 5km drive at 80km/h and then the box was completely silent again! wow.. I dont really trust the box for longevity anymore, but it sure isn't going down without a fight  Grin Maybe it is because of the super pro gearbox oil additive that I threw in with todays oil refill  Roll Eyes, or the new oil just washed some gear debris from the differential hahaha
****One day later, the noise was back. I did another check of the driveshafts, and found that the car was silent again after moving the passenger side driveshaft in and out, then after about 100meters it started making noise again. So it was the cv joint after all! Spent a good 2 hours on the parking lot at around 5 deg C, but I fixed it with a spare CV joint and new grease. Now all is good again.

I hacked my file to 5120mbar, and it is working very well. The only problem is my turbo, it doesnt want to make enough boost to actually go over the old limit haha  Grin It looks like the turbinehousing is cracked, but thats not too bad after ~300.000km of service. A thing I noticed in my logs is that I re-enabled KFLBTS fueling in my file somewhere along the way, and the mixture was way too rich for my liking (0.76). But with my recently accuired skills of writing custom code I just added a switched KFLBTS map that tops out at lambda 0.9 when driving on LPG. Better economy at WOT and lower EGT Grin WIN!
« Last Edit: November 13, 2016, 08:24:33 AM by TijnCU » Logged

TijnCU
Hero Member
*****

Karma: +60/-4
Offline Offline

Posts: 690


flying brick


« Reply #132 on: November 20, 2016, 01:33:51 PM »

In my latest file I am now running a 16x10 hand-coded field  Grin since I have got the hang of asm I decided to switch some more maps with the lpg switch.
Now I'm switching:
-KFZW
-KFLBTS
-FKKVS
-KRKTE (tricky, it is used in 3 different parts of code in 3 different registers. So I gave it 3 dedicated subroutines)
-TVUB
So all fuel control for the LPG is now also done by ME7 except for correction by gas pressure and gas temperature. This will give me more realistic injector opening times in my logs, thus more insight in the tune. So far the LPG is holding up quite nicely, the pressure is low and the factor is only about 15% compared to my 550cc petrol injectors.
I am still looking for the LALIUS code in ida, I may have overlooked it when I was searching for it some time ago. It was at least not referenced as a map, but maybe it is passed as a couple of words.. This would give me the final control that I am looking for, I want to offset the o2 reading a bit during cruising speeds so I get lambda ~1.1. I will add rl as a variable, so it is only active during low loads (and above idle).

Also, while I was working around in the bin, I noticed that my launch control variables are actually partially in a xref code section. So I reworked the adresses to a new location. I noticed in the main code that the coolant temperature variable is actually not even referenced... I never tested the function on cold engine, but I assume that it will work at any coolant temp. Driver should be in control anyways Wink

I received my 3bar mapsensor, but havent installed it yet due to size difference. I'll install it in my new intercooler to save me some extra work.
Logged

grey
Full Member
***

Karma: +4/-1
Offline Offline

Posts: 146


« Reply #133 on: November 20, 2016, 03:41:57 PM »

TijnCU,

really excellent job  Shocked Shocked Shocked
Logged
turbojohan
Full Member
***

Karma: +5/-0
Offline Offline

Posts: 185


« Reply #134 on: November 21, 2016, 12:43:11 AM »

Nice project!
How are IAT's with this intercooler?
I use same one, but heatexchange is quite bad.
IAT's go high and water stays cold..

Logged
Pages: 1 ... 7 8 [9] 10 11 ... 13
  Print  
 
Jump to:  

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Page created in 0.032 seconds with 17 queries. (Pretty URLs adds 0.001s, 0q)