
Deep in the Bowels of Beit Basement ( June 1998 - October 1999 ) [ Photo Gallery ] In mid-1998 , a Union Sabbatical , who was also a member of Jazz and Rock society , happened to mention that they had a old room in the Beit basement that was n't in use . The committee of the time proceeded to make a nuisance of themselves until the society was given permission to take over this much larger room for the library . The room was a mess - cigarette ash several inches deep , the walls covered in eggboxes ( sound proofing ) , and some wooden construction in the middle of the room . After much effort ( and the smashing of a light fitting ) , the place was cleaned out and made ready for painting . The room became white with a dark blue network of piping . Two giant metal struts , studded with bolts , were carefully painted to resemble Daleks . It was a strangely industrial room , with large apparently random concrete blocks ( which made for good seating but inconvenienced shelf layout ) , an abundant selection of different pipes , complete with taps and broken-off ends , and one particularly large and complex ' feature ' ( a sewage output ? ) that was a real pain to paint . A large dragon mural ( " Flarebright " ) covered one stretch of wall , designed by karne , and painted by karne , Viv , and Liz . The door was covered with blackboard paint , so that ' useful ' messages could , theoretically , be written on it in chalk . A large sign declaring something about parking was obtained , and the back also painted with blackboard paint , and ICSF in large white letters . This started off on the door , but eventually made its way to in front of the TV . For this brief time when the society had possession of two rooms , people would occasionally adjourn to the new one to take advantage of the floor space to play Tragic . The room was only 10m or so away from the old library - down a tunnel on the left of the old library , which led under the Quad , past store rooms of Outdoor Club , Canoe , ? ? , and opposite a room belonging to " Tools for Self Reliance " or various others . Karne notes : " ownership varied wildly - mainly various charity groups and 3 world help people - I 'm convinced they kept stealing our paint . . " It was at the end of the accessible corridor , approximately under the Beit Archway . Extract from Wyrmtongue , Oct . 1998 To find it , go to the Union Building , as you enter Beit Quad ( just after the archway ) you should turn left and continue walking until you reach some railings . On your right , is an iron staircase heading downwards . The library is actually in the basement , so go down the stairs and continue until you reach the white door , turn left and go through the brown door . You 'll find yourself in a twisty tunnel , turn right , then left and walk to the end of the corridor . The library is on your right and has a black-door covered in chalk . The tunnel continued , but was blocked by a locked door beyond which was a forbidden zone . However , sometimes this door was unlocked for mysterious reasons , and it was discovered that the tunnel continued down some rickety old wooden steps and right across the Quad , to join up to the NE corner of Beit . The tunnel had a similar unfinished , industrial feel to the room - numerous coloured wires and pipes showing in the ceiling and walls , loose planks with large gaps between them forming the floor , through which miscellaneous small items were occasionally lost . People were known to pull up these planks to retrieve dropped possessions , revealing a 1.5m deep grimy hole with yet more pipes . A blinking amber road light sat cheerily outside the new icsf library door , which was fortunate , as the corridor light seemed to break/become ' lost ' with surprising regularity . Being so close to the old library , the books were transferred by hand by a convoy of icsf committee and proto-committee . The shelves were bolted to the walls with power tools ( thanks to Alan ! ) . Several sets of cheap black metal shelves were bought - these turned out not to be such a good investment , as they tended to buckle under the weight of the books . It was resolved to buy the more expensive grey British Standard shelves next time . This new room served the society with distinction . It was huge , with ample room for all the shelves as well as a large area for sitting and watching TV . The stifling heat led to the purchase of a fan for the library ; a bin was also acquired to control the spread of Union curry . The room became almost respectable over the course of the next year , with the acquisition ( thanks to certain members of the society and monitoring of the , ahem , abandoned goods in Beit Quad ) of a wooden coffee table ( often used for Tragic ) , a really really nasty orange-brown sofa ( later binned on health & safety grounds by the Union ) , 5 good quality reception chairs , another swivel chair , a dusty green carpet , and even a fridge ( belonging to Adam , who did n't have room for it in his flat ) . The wooden stool and increasingly dead black swivel chair were also transferred to the new library , along with ( of course ) First and Second Stage , the video cabinets , and the nasty cushions . A large piece of mattress foam , minus any sort of covering , was also obtained and placed on one of the aforementioned concrete blocks as convenient seating for people watching the TV , or wanting somewhere to collapse . This piece of yellow foam was never covered , resulting in small pieces continually breaking off and being distributed around the floor and on people 's clothing . ( Karne mutters something about Robin , a party , and a large amount of port , related in some way to a stain on the underside of the yellow foam . I do n't want to know . ) The walls were again covered with posters . Two large plastic ' trays ' of spare books were piled in the corner - these were duplicates of books already in the library , acquired from various donations . The library did n't want to keep these ( no room ! ) , but sold them to members at a minimal cost . Being in the same basement , this room suffered the same wildlife problems as the previous one , but for some reason it was less noticeable ( probably more chairs for them to hide under ) . However , Outdoor Club members were known to employ a hammer when entering their stores ( in the same corridor ) , in an attempt to take the cockroaches unawares . This library saw a lot of use during its year . It was frequently open outside official opening hours , turning into a common room for the members , who would turn up whenever they were in college without a lecture to go to . There were regularly 6-15 people in the library at lunchtimes , and much Babylon 5 was watched ( Robin having temporarily loaned his collection to the library ) . Unfortunately , this library also seemed to suffer more than its fair share of security problems in its short existence , possibly aided by the number of people going in and out . Certain valuable items were lost , as well as multiple left-over buckets of paint , and the entire Amber series by Zelazny . At one point the lock was forced , but ( thanks to Alan again ) it was replaced with a new one , plus much chemical metal , which solved that problem . In this year , the library was honoured by the temporary presence of the RCSU mascot , Theta . Several Theta bearers were active icsf members , and for a few weeks between public appearances , Theta ( a large and heavy thermometer ) resided among the shelves . Many of the pictures on this page were taken from a Half-Life map that was made - for more and larger pictures , see Mapping and Modelling - icsf Library . [ Can you add anything to this history ? ] -- Back : The First Library : Beware of the Leopard Next : The Portacabin Experience -- 