void trackloc_reverse(TrackLocation *tloc);
   /* Reverses tloc without changing its actual location. */
 
-const SegmentLinkInfo *trackloc_segmentlink_near(const TrackLocation *tloc);
-const SegmentLinkInfo *trackloc_segmentlink_far(const TrackLocation *tloc);
+const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc);
+const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc,
+                                           const SegPosCombInfo *pci,
+                                           unsigned far);
 
 /*========== useful macros and declarations ==========*/
 
 
-const SegmentLinkInfo *trackloc_segmentlink_near(const TrackLocation *tloc) {
-  SegmentState *seg = s->segments[tloc->segn];
-  const SegmentInfo *segi= &safety_segis[tloc->segn];
+/*
+ */
 
-  return (tloc->backwards ? &segi->forwards :
-         seg->pt_sideways ?  &segi->sideways :
-         &segi->backwards);
+#include <assert.h>
+
+#include "safety.h"
+
+const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc) {
+  State *s= &safety_state;
+  SegmentState *seg= &s->segments[tloc->segn];
+  const SegmentInfo *segi= &info_segments[tloc->segn];
+
+  assert(seg->movposcomb < segi->n_poscombs);
+  return &segi->poscombs[seg->movposcomb];
 }
-  
-const SegmentLinkInfo *trackloc_segmentlink_far(const TrackLocation *tloc) {
-  SegmentState *seg = s->segments[tloc->segn];
-  const SegmentInfo *segi= &safety_segis[tloc->segn];
 
-  return (tloc->backwards ? &segi->backwards :
-         seg->pt_sideways ?  &segi->sideways :
-         &segi->forwards);
+const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc,
+                                           const SegPosCombInfo *pci,
+                                           unsigned far) {
+  return (tloc->backwards ^ far) ? &pci->backwards : &pci->forwards;
 }
   
 long trackloc_remaininseg(const TrackLocation *tloc) {
-  State *s = &safety_state;
-  SegmentState *seg = s->segments[tloc->segn];
-  const SegmentInfo *segi= &safety_segis[tloc->segn];
-  const SegmentLinkInfo *lnki_near, *lnki_far;
+  const SegPosCombInfo *pci;
   long segment_len;
-  
-  lnki_near= trackloc_segmentlink_near(tloc);
-  lnki_far=  trackloc_segmentlink_far(tloc);
-  segment_len= linki_near->dist + link_far->dist;
+
+  pci= trackloc_segposcomb(tloc);
+  segment_len= pci->dist;
   assert(tloc->into <= segment_len);
-  return segment_len - tloc->info;
+  return segment_len - tloc->into;
 }  
 
 void trackloc_further(TrackLocation *tloc, long *remain_io) {
-  State *s = &safety_state;
-  SegmentState *seg = s->segments[tloc->segn];
-  const SegmentInfo *segi= &safety_segis[tloc->segn];
+  const SegPosCombInfo *pci;
   const SegmentLinkInfo *lnki_far;
+  long segment_remain;
 
   segment_remain= trackloc_remaininseg(tloc);
 
     tloc->into += *remain_io;
     *remain_io= 0;
   } else {
-    lnki_far= trackloc_segmentlink_far(tloc);
+    pci= trackloc_segposcomb(tloc);
+    lnki_far= trackloc_segmentlink(tloc, pci, 1);
     *remain_io -= segment_remain;
     tloc->segn= lnki_far->next;
     tloc->into= 0;
 }
 
 void trackloc_reverse(TrackLocation *tloc) {
-  tloc->into= trackloc_remaininseg(tloc->into);
+  tloc->into= trackloc_remaininseg(tloc);
   tloc->backwards ^= 1;
 }