Cardiff extended their unbeaten run in the Championship to nine games following a goalless draw at Millwall.
Peter Whittingham and 18-year-old midfielder Joe Ralls, on his full league debut, went close early on for Malky Mackay's side.
Millwall's best chances fell to James Henry, who hit the crossbar in the first half before substitute Darius Henderson headed over late in the game.
Cardiff, who have not won at Millwall in 29 years, remain third in the table.
A promising Cardiff move led to the first chance of the game after seven minutes with Whittingham forcing keeper Steve Mildenhall into making a save.
Ralls, making his first league start for Cardiff, fired over in the 20th minute before the 18-year-old created an opportunity for Kenny Miller, who lifted his effort too high.
Millwall came agonisingly close to opening the scoring when Jay Simpson won possession and played the ball in behind the defence for flying winger Liam Feeney.
Feeney's low cross found James Henry in front of goal but the midfielder's shot crashed back off the woodwork.
Another swift counter-attack saw Liam Trotter charge forward and find Simpson, who curled his effort the wrong side of the post.
Simpson was replaced at half-time by top scorer Henderson, who had been a surprise omission from the starting line-up.
Four minutes into the second half Cardiff substitute Joe Mason got a sight of goal but his shot was comfortably dealt with by Mildenhall.
Hamer Bouazza came close to nicking it for Millwall with 15 minutes left when he fizzed the ball across goal and inches past the post.
At the other end Miller brought a save from Mildenhall with a glancing header and substitute Rudy Gestede blazed a late chance over.
Henderson had a superb chance to win it for the Lions at the death but his downward header bounced back off the crossbar.
- 23 Mildenhall
- 05 Robinson
- 21 Smith
- 27 Baker
- 31 Lowry Booked
- 06 Trotter
- 08 Bouazza (N'Guessan - 79' )
- 14 Henry Booked
- 15 Feeney
- 26 Abdou
- 20 Simpson (Henderson - 46' )
- 13 Allsopp
- 02 Dunne
- 24 Howard
- 07 Henderson
- 22 N'Guessan
- 01 Marshall
- 02 McNaughton
- 03 Taylor
- 05 Hudson
- 25 Turner
- 04 Kiss (Mason - 39' )
- 07 Whittingham
- 08 Cowie
- 11 Conway Booked (Gestede - 68' )
- 52 Ralls
- 09 Miller
- 22 Heaton
- 18 Naylor
- 10 Earnshaw
- 15 Gestede
- 20 Mason
Live Text Commentary
Full Time The referee blows for the end of the match.90:00 +2:05
Foul by Darius Henderson on Ben Turner, free kick awarded. David Marshall restarts play with the free kick.90:00 +1:04
Handball decision goes against Peter Whittingham. Steve Mildenhall restarts play with the free kick.89:03
Darius Henderson produces a header from close range which goes wide of the left-hand post.88:01
Joe Ralls concedes a free kick for a foul on Jack Smith. Steve Mildenhall takes the direct free kick.87:16
The referee blows for offside against Rudy Gestede. Free kick taken by Steve Mildenhall.86:34
Free kick awarded for a foul by Darius Henderson on Ben Turner. Direct free kick taken by David Marshall.85:50
Ben Turner gives away a free kick for an unfair challenge on Darius Henderson. Jack Smith takes the free kick.85:32
Joe Ralls takes a shot. Save by Steve Mildenhall.83:55
Corner taken left-footed by Peter Whittingham from the right by-line, Steve Mildenhall makes a save.82:44
Free kick crossed left-footed by Peter Whittingham, clearance made by Jack Smith.82:44 Booking
Booking The referee shows Shane Lowry a yellow card for unsporting behaviour.82:37
Free kick awarded for a foul by Shane Lowry on Joe Mason.80:30
Shot on goal by Rudy Gestede from inside the box goes harmlessly over the target.79:57
Corner taken left-footed by Peter Whittingham.79:29
Free kick awarded for a foul by Liam Trotter on Joe Ralls. Joe Ralls takes the free kick.78:07 Substitution
Substitution Dany N'Guessan comes on in place of Hamer Bouazza.77:48 Booking
Booking Booking for James Henry for unsporting behaviour.77:38
Free kick awarded for an unfair challenge on David Marshall by James Henry. Free kick taken by David Marshall.76:22
Kenny Miller takes a shot. Steve Mildenhall makes a save.
Hamer Bouazza produces a left-footed shot from deep inside the penalty box which goes wide of the left-hand post.70:42
Unfair challenge on Mark Hudson by Liam Trotter results in a free kick. David Marshall takes the free kick.69:48
Corner taken by James Henry from the left by-line, clearance made by Mark Hudson.69:06
Nathan Baker takes a shot. David Marshall makes a save.67:40 Substitution
Substitution Craig Conway leaves the field to be replaced by Rudy Gestede.66:21
Hamer Bouazza gives away a free kick for an unfair challenge on Kevin McNaughton. Free kick taken by David Marshall.64:56
Corner taken by Craig Conway, Headed effort from inside the area by Joe Mason misses to the left of the goal.64:10
Handball decision goes against James Henry. David Marshall takes the free kick.61:28
Joe Mason challenges Jack Smith unfairly and gives away a free kick. Steve Mildenhall restarts play with the free kick.60:37
James Henry has shot on goal from just outside the penalty box which goes wide of the right-hand upright.57:52
Handball decision goes against Peter Whittingham. Free kick crossed by Hamer Bouazza, David Marshall makes a save.49:59
Free kick awarded for a foul by Kevin McNaughton on Liam Trotter. Steve Mildenhall restarts play with the free kick.49:18
Joe Mason takes a shot. Save by Steve Mildenhall.46:08
Darius Henderson concedes a free kick for a foul on Ben Turner. David Marshall restarts play with the free kick.45:35
Free kick awarded for a foul by Peter Whittingham on Nadjim Abdou. Jack Smith restarts play with the free kick.45:01
The second half kicks off.45:01 Substitution
Substitution Darius Henderson on for Jay Simpson.45:00 +1:37 Half time
Half Time The ref blows to end the first period.44:53
Free kick awarded for an unfair challenge on Shane Lowry by Joe Mason. Free kick taken by Steve Mildenhall.41:49
Nadjim Abdou produces a left-footed shot from the edge of the box and misses to the right of the goal.40:24
Inswinging corner taken by James Henry from the left by-line.38:32 Substitution
Substitution (Cardiff) makes a substitution, with Joe Mason coming on for Filip Kiss.35:27
Unfair challenge on Shane Lowry by Kenny Miller results in a free kick. Free kick taken by Jack Smith.35:11
James Henry produces a right-footed shot from deep inside the penalty box and strikes the post.34:15
Peter Whittingham fouled by Nadjim Abdou, the ref awards a free kick. Free kick taken by Peter Whittingham.32:49
Effort on goal by Kenny Miller from a long way out goes over the bar.28:24
Free kick crossed by Hamer Bouazza, Peter Whittingham makes a clearance.28:24 Booking
Booking Craig Conway goes into the book.28:20
Unfair challenge on Jack Smith by Craig Conway results in a free kick.26:22
Liam Feeney challenges Craig Conway unfairly and gives away a free kick. Free kick taken by David Marshall.19:52
Shot by Joe Ralls from outside the box goes high over the crossbar.19:02
Corner taken by Peter Whittingham played to the near post, Nadjim Abdou manages to make a clearance. Inswinging corner taken left-footed by Peter Whittingham from the right by-line to the near post, clearance by James Henry.17:57
Unfair challenge on Craig Conway by James Henry results in a free kick. The free kick is swung in left-footed by Peter Whittingham, clearance by Nathan Baker.13:55
Inswinging corner taken by Don Cowie, Jay Simpson fouled by Don Cowie, the ref awards a free kick. Steve Mildenhall takes the free kick.11:35
Jack Smith gives away a free kick for an unfair challenge on Craig Conway. Free kick taken by Andrew Taylor.8:06
Don Cowie takes a inswinging corner from the left by-line played to the near post, clearance made by Nathan Baker.7:40
Peter Whittingham takes a shot. Steve Mildenhall makes a save.4:41
Kenny Miller gives away a free kick for an unfair challenge on Paul Robinson. Steve Mildenhall takes the free kick.4:03
Unfair challenge on Andrew Taylor by Liam Feeney results in a free kick. Andrew Taylor restarts play with the free kick.2:34
Free kick awarded for a foul by James Henry on Andrew Taylor. David Marshall restarts play with the free kick.0:00
The referee gets the match started.
Live data and text provided by our data suppliers